23,116
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
#define NUM 4
void sig_child(int signo);
void sig_alarm(int signo);
int done;
int srv_num = 0;
pid_t *thread = NULL;
int
main(void)
{
int i;
pid_t pid;
thread = calloc(NUM+1, sizeof(pid_t));
for (i = 1; i <= NUM; i++) {
if ((pid = fork()) == 0) {
srv_num = i;
break;
} else {
thread[i] = pid;
fprintf(stderr, "thread[%d]=%ld\n", i, thread[i]);
}
}
//here is parent
if (srv_num == 1) { //1 child
//fprintf(stderr, "I am %ld\n", (long)getpid());
signal(SIGALRM, sig_alarm);
pause();
fprintf(stderr, "ok,1, I am %ld\n", getpid());
//exit(0);
}
if (srv_num == 2) { //2 child
//fprintf(stderr, "I am %ld\n", (long)getpid());
signal(SIGALRM, sig_alarm);
pause();
fprintf(stderr, "ok,2, I am %ld\n", getpid());
//exit(0);
}
if (srv_num == 3) { //3 child
//fprintf(stderr, "I am %ld\n", (long)getpid());
signal(SIGALRM, sig_alarm);
pause();
fprintf(stderr, "ok,3, I am %ld\n", getpid());
//exit(0);
}
if (srv_num == 4) { //4 child
//fprintf(stderr, "I am %ld\n", (long)getpid());
signal(SIGALRM, sig_alarm);
pause();
fprintf(stderr, "ok, 4, I am %ld\n", getpid());
//exit(0);
}
if (srv_num == 0) { //parent
fprintf(stderr, "p = %ld, thread[3]=%d\n", getpid(), thread[3]);
kill(thread[1], SIGALRM);
if (wait(NULL) == thread[1]) { //1:1
kill(thread[3], SIGALRM);
if (wait(NULL) == thread[3]) {//2:3
kill(thread[2], SIGALRM);
if (wait(NULL) == thread[2]) {//3:2
kill(thread[4], SIGALRM);
if (wait(NULL) == thread[4]) //last :4
fprintf(stderr, "all is ok \n");
}
}
}
}
exit(1);
}
void sig_alarm(int signo)
{
if (signo == SIGALRM)
return;
}
pid_t pid;
i=0 ;
while(i <10)
{
pid=fork();
if(pid==0)
break; //每个子进程退出while
if(pid<0)
printf("fork error at %d\n",i);
i++ ; //父进程继续 循环fork
}
//子进程继续。。。。。。。。。