死活进不了子进程
最近在unix环境高级编程,在信号那一章节有一个练习题:
代码如下,代码进不了在注释,求原因,小菜在这里谢谢了
#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <signal.h>#include <stdio.h>#include <string.h>#include <stdlib.h>typedef void (*Sigfunc)(int);/***************************************** *local var ****************************************/static volatile sig_atomic_t sigflag;static sigset_t newmask, oldmask, zeromask;/****************************************** *extern function declare ******************************************/Sigfunc signal(int signo, Sigfunc sigfun);void TELL_WAIT(void);void TELL_PARENT(pid_t pid);void WAIT_PARENT(void);void TELL_CHILD(pid_t pid);void WAIT_CHILD(void);/***************************************** *local function declare and implement *****************************************/static void sig_usr(int signo){ sigflag = 1;}/****************************************** *extern function implement *****************************************/void TELL_WAIT(void){ if( signal(SIGUSR1, sig_usr) == SIG_ERR) ; if( signal(SIGUSR2, sig_usr) == SIG_ERR) ; sigemptyset(&zeromask); sigemptyset(&newmask); sigaddset(&newmask, SIGUSR1); sigaddset(&newmask, SIGUSR2); if(sigprocmask(SIG_BLOCK, &newmask, &oldmask)<0) ;}void TELL_PARENT(pid_t pid){ kill(pid, SIGUSR2);}void WAIT_PARENT(void){ while(sigflag == 0) sigsuspend(&zeromask); sigflag = 0; if(sigprocmask(SIG_SETMASK, &oldmask, NULL)<0) ;}void TELL_CHILD(pid_t pid){ kill(pid, SIGUSR2);}void WAIT_CHILD(void){ while(sigflag == 0) sigsuspend(&zeromask); sigflag = 0; if(sigprocmask(SIG_SETMASK, &oldmask, NULL)<0) ;}Sigfunc signal(int signo, Sigfunc sigfun){ struct sigaction act, oact; act.sa_handler = sigfun; sigemptyset(&act.sa_mask); act.sa_flags = 0; if(signo == SIGALRM){#ifdef SA_INTERRUPT act.sa_flags |= SA_INTERRUPT; printf("[signal sysnc] defined SA_INTERRUPT\n");#endif }else{#ifdef SA_RESTART act.sa_flags |= SA_RESTART; printf("[Signal Sysnc] defined SA_RESTART\n");#endif } if(sigaction(signo, &act, &oact)<0) return SIG_ERR; return oact.sa_handler;}static volatile int i = 0;int main(void){ pid_t pid; int fd; char buf[512]; if((fd = open("./temp.file", O_CREAT | O_TRUNC | O_WRONLY, 0644))<0) ; sprintf(buf, "%d", i); write(fd, buf , strlen(buf)); if((pid = fork())<0){ fprintf(stderr, "fork error\n"); return -1; }else if(0 == pid){ int j; printf("enter child\n"); for(j = 0; j<100; j++){ ///死活都进不了这里//// WAIT_PARENT(); ++i; sprintf(buf, "%d", i); write(fd, buf , strlen(buf)); printf("child:%d\n", i); TELL_PARENT(getppid()); } exit(0); }else{ printf("enter parent\n"); TELL_CHILD(pid); while(i != 100){ WAIT_CHILD(); ++i; sprintf(buf, "%d", i); write(fd, buf , strlen(buf)); printf("parent:%d\n", i); TELL_CHILD(pid); } } return 0;}#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <signal.h>#include <stdio.h>#include <string.h>#include <stdlib.h>typedef void (*Sigfunc)(int);/***************************************** *local var ****************************************/static volatile sig_atomic_t sigflag;static sigset_t newmask, oldmask, zeromask;/****************************************** *extern function declare ******************************************/Sigfunc signal(int signo, Sigfunc sigfun);void TELL_WAIT(void);void TELL_PARENT(pid_t pid);void WAIT_PARENT(void);void TELL_CHILD(pid_t pid);void WAIT_CHILD(void);/***************************************** *local function declare and implement *****************************************/static void sig_usr(int signo){ sigflag = 1;}/****************************************** *extern function implement *****************************************/void TELL_WAIT(void){ if( signal(SIGUSR1, sig_usr) == SIG_ERR) ; if( signal(SIGUSR2, sig_usr) == SIG_ERR) ; sigemptyset(&zeromask); sigemptyset(&newmask); sigaddset(&newmask, SIGUSR1); sigaddset(&newmask, SIGUSR2); if(sigprocmask(SIG_BLOCK, &newmask, &oldmask)<0) ;}void TELL_PARENT(pid_t pid){ kill(pid, SIGUSR2);}void WAIT_PARENT(void){ while(sigflag == 0) sigsuspend(&zeromask); sigflag = 0; if(sigprocmask(SIG_SETMASK, &oldmask, NULL)<0) ;}void TELL_CHILD(pid_t pid){ kill(pid, SIGUSR2);}void WAIT_CHILD(void){ while(sigflag == 0) sigsuspend(&zeromask); sigflag = 0; if(sigprocmask(SIG_SETMASK, &oldmask, NULL)<0) ;}Sigfunc signal(int signo, Sigfunc sigfun){ struct sigaction act, oact; act.sa_handler = sigfun; sigemptyset(&act.sa_mask); act.sa_flags = 0; if(signo == SIGALRM){#ifdef SA_INTERRUPT act.sa_flags |= SA_INTERRUPT; printf("[signal sysnc] defined SA_INTERRUPT\n");#endif }else{#ifdef SA_RESTART act.sa_flags |= SA_RESTART; printf("[Signal Sysnc] defined SA_RESTART\n");#endif } if(sigaction(signo, &act, &oact)<0) return SIG_ERR; return oact.sa_handler;}static volatile int i = 0;int main(void){ pid_t pid; int fd; char buf[512]; TELL_WAIT(); if((fd = open("./temp.file", O_CREAT | O_TRUNC | O_WRONLY, 0644))<0) ; sprintf(buf, "%d", i); write(fd, buf , strlen(buf)); if((pid = fork())<0){ fprintf(stderr, "fork error\n"); return -1; }else if(0 == pid){ int j; printf("enter child\n"); for(j = 0; j<100; j++){ ///死活都进不了这里//// WAIT_PARENT(); ++i; sprintf(buf, "%d", i); write(fd, buf , strlen(buf)); printf("child:%d\n", i); TELL_PARENT(getppid()); } exit(0); }else{ printf("enter parent\n"); TELL_CHILD(pid); while(i != 100){ WAIT_CHILD(); ++i; sprintf(buf, "%d", i); write(fd, buf , strlen(buf)); printf("parent:%d\n", i); TELL_CHILD(pid); } } return 0;}