linux环境c语言编程!问题棘手!高手进!
源代码:#include<stdio.h>#include<stdlib.h>#include<sched.h>#include<sys/time.h>#include<...
源代码:
#include<stdio.h>
#include<stdlib.h>
#include<sched.h>
#include<sys/time.h>
#include<sys/resource.h>
int main(int argc,char *argv[])
{
//int i,j,status;
int i;
int pid[3];//存放进程号
struct sched_param p[3];//调度参数结构
int demo[3];
for(i=0;i<3;i++)
demo[i]=(argv[i+1]==NULL)?10:atoi(argv[i+1]);
printf("demo:\n");
for(i=0;i<3;i++)
printf("%d\n",demo[i]);
for(i=0;i<3;i++)
{
//创建3个子进程
if((pid[i]=fork())>0)
{//父进程执行代码
//从命令行参数中取进程优先数存放在调度参数结构中
p[i].sched_priority=(argv[i+1]!=NULL)?atoi(argv[i+1]):10;
//根据命令行参数设置进程的调度策略
sched_setscheduler(pid[i],(argv[i+4]!=NULL)?atoi(argv[i+4]):SCHED_OTHER,&p[i]);
//根据命令行的参数设置进程的优先级
setpriority(PRIO_PROCESS,pid[i],(argv[i+1]!=NULL)?atoi(argv[i+1]):10);
}
else//子进程执行代码
{
sleep(1);
for(i=0;i<3;i++)
{
//报告进程号和优先级
printf("child %d priority=%d\n",getpid(),getpriority(PRIO_PROCESS,0));
sleep(1);
}
exit(EXIT_SUCCESS);
//return EXIT_SUCCESS;
}
}
//父进程报告子进程调度策略
for(i=0;i<3;i++)
printf("My child %d 's policy is %d\n",pid[i],sched_getscheduler(pid[i]));
return EXIT_SUCCESS;
}
现有如下问题:
1.终端里不加任何参数运行时demo(这段程序是为测试参数输入是否正确额外加上去的)本来应该是三个10 但是linux下运行得到的却是10 0 0,而且后面给进程设置优先级貌似也是这个问题,三个进程的优先级是10 0 0,而且设置三个进程的调度算法那里也有类似的问题。个人感觉都是demo[i]=(argv[i+1]==NULL)?10:atoi(argv[i+1]);这样的语句有问题,但是又不知道是什么问题导致,故跪求解释!
2.linux终端里就算运行时后面加上三个参数,调度方法采用SCHED_OTHER,实验结果应该是优先数低的进程先执行,比如输入./psched 5 1 10(假定编译后形成的可执行文件名是psched),期待的输出结果应是优先级为1的先执行,然后5 然后10 但是现在结果是5 1 10 也就是你怎么输入的它怎么输出,完全按照你输入的顺序。本人百思不得其解,期待高手解答!如果答案满意,我可以再追加20分! 展开
#include<stdio.h>
#include<stdlib.h>
#include<sched.h>
#include<sys/time.h>
#include<sys/resource.h>
int main(int argc,char *argv[])
{
//int i,j,status;
int i;
int pid[3];//存放进程号
struct sched_param p[3];//调度参数结构
int demo[3];
for(i=0;i<3;i++)
demo[i]=(argv[i+1]==NULL)?10:atoi(argv[i+1]);
printf("demo:\n");
for(i=0;i<3;i++)
printf("%d\n",demo[i]);
for(i=0;i<3;i++)
{
//创建3个子进程
if((pid[i]=fork())>0)
{//父进程执行代码
//从命令行参数中取进程优先数存放在调度参数结构中
p[i].sched_priority=(argv[i+1]!=NULL)?atoi(argv[i+1]):10;
//根据命令行参数设置进程的调度策略
sched_setscheduler(pid[i],(argv[i+4]!=NULL)?atoi(argv[i+4]):SCHED_OTHER,&p[i]);
//根据命令行的参数设置进程的优先级
setpriority(PRIO_PROCESS,pid[i],(argv[i+1]!=NULL)?atoi(argv[i+1]):10);
}
else//子进程执行代码
{
sleep(1);
for(i=0;i<3;i++)
{
//报告进程号和优先级
printf("child %d priority=%d\n",getpid(),getpriority(PRIO_PROCESS,0));
sleep(1);
}
exit(EXIT_SUCCESS);
//return EXIT_SUCCESS;
}
}
//父进程报告子进程调度策略
for(i=0;i<3;i++)
printf("My child %d 's policy is %d\n",pid[i],sched_getscheduler(pid[i]));
return EXIT_SUCCESS;
}
现有如下问题:
1.终端里不加任何参数运行时demo(这段程序是为测试参数输入是否正确额外加上去的)本来应该是三个10 但是linux下运行得到的却是10 0 0,而且后面给进程设置优先级貌似也是这个问题,三个进程的优先级是10 0 0,而且设置三个进程的调度算法那里也有类似的问题。个人感觉都是demo[i]=(argv[i+1]==NULL)?10:atoi(argv[i+1]);这样的语句有问题,但是又不知道是什么问题导致,故跪求解释!
2.linux终端里就算运行时后面加上三个参数,调度方法采用SCHED_OTHER,实验结果应该是优先数低的进程先执行,比如输入./psched 5 1 10(假定编译后形成的可执行文件名是psched),期待的输出结果应是优先级为1的先执行,然后5 然后10 但是现在结果是5 1 10 也就是你怎么输入的它怎么输出,完全按照你输入的顺序。本人百思不得其解,期待高手解答!如果答案满意,我可以再追加20分! 展开
5个回答
展开全部
【第一个问题】
argv[i]越界了,不能保证都是null,改成这样
for(i=1;i<argc;i++)
demo[i-1]=atoi(argv[i]);
for(--i;i<3;++i)
demo[i]=10;
【第二个问题】
我的理解是第一个子进程wakeup的瞬间,其他的子进程还是sleep,因此第一个子进程执行了printf
优先级再高的进程sleep了也抢不过优先级低的活动进程
因此最好保持3个子进程同时活动
else//子进程执行代码
{
sleep(1);//为了父进程顺利启动3个子进程,sleep还是留着吧
for(i=1;i;i++);//保持活动一段时间
//报告进程号和优先级
printf("child %d priority=%d\n",getpid(),getpriority(PRIO_PROCESS,0));
exit(EXIT_SUCCESS);
//return EXIT_SUCCESS;
}
argv[i]越界了,不能保证都是null,改成这样
for(i=1;i<argc;i++)
demo[i-1]=atoi(argv[i]);
for(--i;i<3;++i)
demo[i]=10;
【第二个问题】
我的理解是第一个子进程wakeup的瞬间,其他的子进程还是sleep,因此第一个子进程执行了printf
优先级再高的进程sleep了也抢不过优先级低的活动进程
因此最好保持3个子进程同时活动
else//子进程执行代码
{
sleep(1);//为了父进程顺利启动3个子进程,sleep还是留着吧
for(i=1;i;i++);//保持活动一段时间
//报告进程号和优先级
printf("child %d priority=%d\n",getpid(),getpriority(PRIO_PROCESS,0));
exit(EXIT_SUCCESS);
//return EXIT_SUCCESS;
}
参考资料: 没做过实验,自己琢磨的,错了可不负责任
展开全部
呼呼 有难度 这种专业性较强的问题你可以到 编程中国论坛去求助 那里的全是高手....
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1.demo[i]=(argv[i+1]==NULL)?10:atoi(argv[i+1]);这句话确实有问题,因为i+1可能导致数组访问越界,改为
demo[i]=(i+1>=argc)?10:atoi(argv[i+1]);即可
2.我在LINUX下执行过多次(内核版本2.6.32)每次结果都不一样,你所提到的每次都一样应该是,程序中输出次数太小导致,看不出规律。
我对此的解释是当前LINUX进程调度器的调度方式都只能用尽力而为来形容,它并不能保证进程严格的按照优先级来调度执行。
另外关于新版本的LINUX内核调度器的情况,可以参照
http://www.ibm.com/developerworks/cn/linux/l-completely-fair-scheduler/
demo[i]=(i+1>=argc)?10:atoi(argv[i+1]);即可
2.我在LINUX下执行过多次(内核版本2.6.32)每次结果都不一样,你所提到的每次都一样应该是,程序中输出次数太小导致,看不出规律。
我对此的解释是当前LINUX进程调度器的调度方式都只能用尽力而为来形容,它并不能保证进程严格的按照优先级来调度执行。
另外关于新版本的LINUX内核调度器的情况,可以参照
http://www.ibm.com/developerworks/cn/linux/l-completely-fair-scheduler/
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这份诱人。。我没分下载书籍看了。郁闷。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
建议去学习LINUX内核,再回来学习Linux编程吧~!
如果不对LINUX内核了解,根本就无法去学习
如果不对LINUX内核了解,根本就无法去学习
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询