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分!
展开
 我来答
板唱Z9
2010-08-07 · TA获得超过1426个赞
知道小有建树答主
回答量:578
采纳率:100%
帮助的人:0
展开全部
【第一个问题】

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;
}

参考资料: 没做过实验,自己琢磨的,错了可不负责任

shenglongmen
2010-08-06 · 超过30用户采纳过TA的回答
知道答主
回答量:148
采纳率:0%
帮助的人:69.7万
展开全部
呼呼 有难度 这种专业性较强的问题你可以到 编程中国论坛去求助 那里的全是高手....
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
回忆非主流AY
2010-08-09
知道小有建树答主
回答量:12
采纳率:0%
帮助的人:7.9万
展开全部
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/
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
danhuiheng
2010-08-10 · 超过29用户采纳过TA的回答
知道答主
回答量:170
采纳率:0%
帮助的人:81.1万
展开全部
这份诱人。。我没分下载书籍看了。郁闷。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
z85525006
2010-08-12 · TA获得超过1003个赞
知道小有建树答主
回答量:672
采纳率:0%
帮助的人:564万
展开全部
建议去学习LINUX内核,再回来学习Linux编程吧~!

如果不对LINUX内核了解,根本就无法去学习
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式