|
发表于 2006-6-29 22:47:31
|
显示全部楼层
#include<stdio.h>
#include<signal.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
int wait_mark=0;
void waiting()
{while(wait_mark!=0);
}
void stop()
{wait_mark=0;
}
main(){
pid_t p1=0,p2=0;
while((p1=fork())==-1);
if(p1>0) /*如果是父进程,就接着fork另一个子进程 p2 */
while((p2=fork())==-1);
if(p2>0){ /*p2要赋初值0,父进程执行if里面的代码*/
wait_mark=1; /*使父进程在调用waiting()时,悬挂起来*/
signal(SIGALRM,stop);/*父进程收到SIGALRM时,退出waiting()函数*/
alarm(15);
waiting();/*waiting()悬挂15秒后会退出,然后执行后面的kill()*/
kill(p1,SIGALRM);
kill(p2,SIGALRM);
/*waitpid(p1);*/
wait(NULL);/*你以前的wait(10)是个错误的用法,它的参数应该是个地址,这里用两个wait()的方法总感觉不可靠,不过在我的电脑上已运行出正确的结果了*/
wait(NULL);
printf("parent....my child p1 is %d, my child p2 is %d\n",p1,p2);
}
/*在父进程中,p1,p2都大于0. 在p1子进程中,p1等于0,p2等于0. 在p2子进程中,p1大于0,p2等于0*/
else if(p1==0&&p2==0) /*这里要修改,否则两个子进程都执行else里面的代码,所以看到程序执行结果是p1...p1...,*/
{
wait_mark=1;
signal(SIGALRM,stop);
waiting();
printf("p1...p1=%d, p2=%d, i am p1, and my pid is%d,\n",p1,p2,getpid());
exit(0);
}
else /*进行p2子进程*/
{
wait_mark=1;
signal(SIGALRM,stop);
waiting();
printf("p1...p1=%d, p2=%d, i am p2, and my pid is %d,\n",p1,p2,getpid());
exit(0);
}
} |
|