你敢吗?抛砖引玉的问题,值得一看

wenyubo 2011-07-13 03:39:05
路过的技术牛人,想请教一个问题。我想用fork产生3个子进程,分别执行不同的任务。并且给他们设定不同的优先级,让他们按照优先级执行。
我的代码在下面。进程1,child1的优先级是14.child2的优先级是10.child3的优先级是-3.按道理应该是子进程child3先执行。

#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<sys/time.h>
#include<sys/resource.h>
#include<sys/types.h>


void main()
{
pid_t father,child1,child2,child3;
int prio;
father=getpid();
setpriority(PRIO_PROCESS,0,20);
//nice(10);
printf("the father ID is : %d\n",father);
prio=getpriority(PRIO_PROCESS,0);
printf("the father priority is %d\n",prio);
child1=fork();
if(child1==0) {
setpriority(PRIO_PROCESS,0,14);
prio=getpriority(PRIO_PROCESS,0);
printf("the child one ID is : %d\n",getpid());
printf("the child one priority is %d\n",prio);
}
else if(child1>0){
child2=fork();
if(child2==0) {
setpriority(PRIO_PROCESS,0,10);
prio=getpriority(PRIO_PROCESS,0);
printf("the child two ID is : %d\n",getpid());
printf("the child two priority is %d\n",prio);
}
else if(child2>0){
child3=fork();
if(child3==0) {
setpriority(PRIO_PROCESS,0,-3);
prio=getpriority(PRIO_PROCESS,0);
printf("the child three ID is : %d\n",getpid());
printf("the child three priority is %d\n",prio);
}
else if(child3>0) {
printf("my ID is %d\n",getpid());
printf("my prio is %d\n",getpriority(PRIO_PROCESS,0));
}

}
}

}

执行结果是:
先执行1,再 2,再3
...全文
106 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wenyubo 2011-07-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wyjq395 的回复:]

C/C++ code

#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<sys/time.h>
#include<sys/resource.h>
#include<sys/types.h>
#include<sched.h>


void main()
{
pid_t father,child1,child2……
[/Quote]
你这里再main的主进程通过 rt=sched_setscheduler(0,SCHED_RR,&my_params);设置了优先级,这个函数是设置实时进程的。接着你又通过setpriority(PRIO_PROCESS,0,20)函数设置进程,这个是普通进程的静态优先级,同一个main进程怎么设置两个啊。到底以那个为准啊,好像不对吧
wyjq395 2011-07-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wenyubo 的回复:]
听说可以用状态机实现。
[/Quote]
如果仅仅是让进程3比2先执行,2比1先执行,状态机当然可以实现了,而且不用状态机,只要一个flag就可以了。
更简单一点只要两个sleep就可以了。
wenyubo 2011-07-14
  • 打赏
  • 举报
回复
听说可以用状态机实现。
wenyubo 2011-07-13
  • 打赏
  • 举报
回复
谢谢4楼和5楼的兄弟。那我该如何搞呢
wyjq395 2011-07-13
  • 打赏
  • 举报
回复

#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<sys/time.h>
#include<sys/resource.h>
#include<sys/types.h>
#include<sched.h>


void main()
{
pid_t father,child1,child2,child3;
int prio;
int rt,curr_policy;
struct sched_param my_params;

my_params.sched_priority=sched_get_priority_max(SCHED_RR);

father=getpid();
curr_policy=sched_getscheduler(father);
printf("SCHED_OTHER = %d SCHED_FIFO =%d SCHED_RR=%d \n",SCHED_OTHER,SCHED_FIFO,SCHED_RR);
printf("the current scheduler = %d \n",curr_policy);

rt=sched_setscheduler(0,SCHED_RR,&my_params);
if(rt<0)
{
perror("sched_setscheduler to SCHED_RR error");
exit(0);
}
curr_policy=sched_getscheduler(father);
printf("the current scheduler = %d \n",curr_policy);

//father=getpid();
setpriority(PRIO_PROCESS,0,20);
//nice(10);
printf("the father ID is : %d\n",father);
prio=getpriority(PRIO_PROCESS,0);
printf("the father priority is %d\n",prio);
child1=fork();
if(child1==0) {
curr_policy=sched_getscheduler(child1);
printf("child1 scheduler = %d \n",curr_policy);
setpriority(PRIO_PROCESS,0,14);
prio=getpriority(PRIO_PROCESS,0);
printf("the child one ID is : %d\n",getpid());
printf("the child one priority is %d\n",prio);
}
else if(child1>0){
child2=fork();
if(child2==0) {
curr_policy=sched_getscheduler(child2);
printf("child2 scheduler = %d \n",curr_policy);
setpriority(PRIO_PROCESS,0,10);
prio=getpriority(PRIO_PROCESS,0);
printf("the child two ID is : %d\n",getpid());
printf("the child two priority is %d\n",prio);
}
else if(child2>0){
child3=fork();
if(child3==0) {
curr_policy=sched_getscheduler(child3);
printf("child2 scheduler = %d \n",curr_policy);
setpriority(PRIO_PROCESS,0,-3);
prio=getpriority(PRIO_PROCESS,0);
printf("the child three ID is : %d\n",getpid());
printf("the child three priority is %d\n",prio);
}
else if(child3>0) {
printf("my ID is %d\n",getpid());
printf("my prio is %d\n",getpriority(PRIO_PROCESS,0));
}

}
}

}


试了下SCHED_RR实时调度策略,结果还是不行。
我也一直相信4楼大哥说的“你是在子进程起来之后,再修改的子进程的优先级,这样做可能晚了。因为你修改进程3的优先级时,进程2可能都已经执行完了。。。”
如果有什么特别需要只能靠signal了来同步了。
dongjiawei316 2011-07-13
  • 打赏
  • 举报
回复
第一,你的父进程的优先级是什么呢?如果不是超级用户的话,子进程的优先级只能往低了设,而不能往高设。
第二,你这种方法修改的是静态优先级,不是动态优先级。所以就算改成功了,运行结果也是不确定的。
第三,你是在子进程起来之后,再修改的子进程的优先级,这样做可能晚了。因为你修改进程3的优先级时,进程2可能都已经执行完了。。。
wyjq395 2011-07-13
  • 打赏
  • 举报
回复
setpriority这个函数要求有root的权限才能降低优先级的数值,而且只对静态优先级有效。
如果仅仅是要求先执行1,再 2,再3,现在运行的结果估计就是这样了,如果不是,可以使用信号signal,等1执行完再2,再3。
先标记下,下班回去再看。
challenge99 2011-07-13
  • 打赏
  • 举报
回复
玉呢? 玉呢?
楼上的,抽烟不好哈

金刚葫芦娃 2011-07-13
  • 打赏
  • 举报
回复
同样的问题发两遍..辛苦你了.

23,116

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧