首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

死活进不了子进程,该怎么处理

2012-05-28 
死活进不了子进程最近在unix环境高级编程,在信号那一章节有一个练习题:代码如下,代码进不了在注释,求原因,

死活进不了子进程
最近在unix环境高级编程,在信号那一章节有一个练习题:
代码如下,代码进不了在注释,求原因,小菜在这里谢谢了

C/C++ code
#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;}


[解决办法]
C/C++ code
#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;} 

热点排行