日期:2014-05-16  浏览次数:20619 次

关于子linux进程调度的问题
我   有一个   程序,是想让五个子进程一个一个地打印出信息,但是程序实现的是五个进程一起打印出来了,怎么改才能实现呢?   麻烦给看看
#include   "stdio.h "
#include   <sys/types.h>
#include   <unistd.h>
#include   <sched.h>
#include   <signal.h>
#include   <sys/wait.h>
#include   <string.h>
#include   <errno.h>
#include   <stdlib.h>
#include   <sys/time.h>
#include   <sys/resource.h>

pid_t   pid[5];
void   kill_process()
{
exit(0);
}
 
/*显示进程调度策略和优先级的信息*/
  void   show_info(pid_t   pid)
{
struct   sched_param   sp;
int   policy;

policy   =   sched_getscheduler(pid);
if   (policy   ==   -1)   {
perror( "sched_getscheduler ");
fprintf(stderr,   "failed   to   get   pid   %d 's   policy\n ",   pid);
exit(1);
}

printf( "scheduling   policy:   ");/*打印进程的调度策略*/
switch   (policy)   {
case   SCHED_OTHER:
printf( "SCHED_OTHER\n ");
break;
case   SCHED_FIFO:
printf( "SCHED_FIFO\n ");
break;
case   SCHED_RR:
printf( "SCHED_RR\n ");
break;
default:
printf( "unknown\n ");
}

if   (sched_getparam(pid,   &sp))   {
perror( "sched_getparam ");
fprintf(stderr,   "failed   to   get   pid   %d 's   attributes\n ",   pid);
exit(1);
}

printf( "scheduling   priority:   %d\n ",   sp.sched_priority);/*打印进程的优先级*/
}


void   user_fork(int   i)
{
    char   outstr[20];
   
            if   ((pid[i]   =   fork())   <   0)   {   /*创建进程*/
                                printf( "fork   error ");
                }  
else   if   (pid[i]   ==   0)   {
signal(SIGUSR1,kill_process);
                while(1)
                {
                              sleep(10);
sprintf(outstr, "I   am   P%d---pid=%d\n ",i+1,getpid());
write(1,outstr,sizeof(outstr));
strcpy(outstr, " ");
pid[i]=getpid();
show_info(pid[i]);

                }

      }
}


int
main(void)
{
pid_t   pid[5];
user_fork(0);
sleep(10);
user_fork(1);
sleep(10);
user_fork(2);
sleep(10);
user_fork(3);
sleep(10);
kill(pid[3],SIGUSR1);
kill(pid[2],SIGUSR1);
user_fork(4);
sleep(10);
if(waitpid(pid[3],NULL,0)!=pid[3])
write(2, "wait   3   error ",20);
if(waitpid(pid[2],NULL,0)!=pid[2])
write(2, "wait   2   error ",20);
getchar();
exit(0); <