8章 进程控制

来源:互联网 发布:c语言源代码大全 编辑:程序博客网 时间:2024/06/06 00:19

不同进程直接不同步或者通信就会产生竞争关系。

下面是一个父子进程同时输出,没有进行同步处理

static void print(char *str){    char *ptr;    char c;    setbuf(stdout , NULL);    for(ptr = str ;(c = *ptr++) != 0 ;){//这句for循环,先初始化ptr,然后利用c等于一个值,++的情况处理,既可以遍历,也可以输出.        putc(c , stdout);        sleep(1);//睡觉一秒    }}int main(void){    pid_t pid;    if((pid = fork()) < 0)        err_sys("fork error\n");    else if(pid == 0){        print("child ouput\n");    }else{        print("parent ouput\n");    }    exit(0);}

pcahirelnd to oupuuput //输出相互干扰,毫无逻辑。必须加上通信机制
t
按 来关闭窗口…

sigset_t newmask , oldmask , waitmask;volatile sig_atomic_t sigflag = 0;static void sig_int(int signo){    sigflag = 1;//信号已经到达,可以同步了} void tell_wait(void) {     if(signal(SIGUSR1 , sig_int) == SIG_ERR)//注册信号         err_sys("signal(SIGUSR1) error");     if(signal(SIGUSR2 , sig_int) == SIG_ERR)//注册信号         err_sys("signal(SIGUSR2) error");     sigemptyset(&newmask);     sigaddset(&newmask , SIGUSR1);     sigaddset(&newmask , SIGUSR2);     sigemptyset(&waitmask);//     if(sigprocmask(SIG_BLOCK , &newmask , &oldmask) < 0)//屏蔽INT信号         err_sys("SIG_BLOCK err");//屏蔽这两个信号,因为此处单独用作进程通信使用. } void tell_parent(pid_t pid) {     kill(pid , SIGUSR2); } void wait_parent(void) {     while (sigflag == 0)         sigsuspend(&waitmask);     sigflag = 0;     if(sigprocmask(SIG_SETMASK , &oldmask , NULL) < 0)//恢复INT信号         err_sys("SIG_SETMASK error"); } void tell_child(pid_t pid) {     kill(pid , SIGUSR1); } void wait_child(void) {     while (sigflag == 0)         sigsuspend(&waitmask);     sigflag = 0;     if(sigprocmask(SIG_SETMASK , &oldmask , NULL) < 0)//恢复INT信号         err_sys("SIG_SETMASK error"); } static void print(char *str) {     char *ptr;     char c;     setbuf(stdout , NULL);     for(ptr = str ;(c = *ptr++) != 0 ;){//这句for循环,先初始化ptr,然后利用c等于一个值,++的情况处理,既可以遍历,也可以输出.         putc(c , stdout);         sleep(1);//睡觉一秒     } } int main(void) {     pid_t pid;     tell_wait();     if((pid = fork()) < 0)         err_sys("fork error\n");     else if(pid == 0){         wait_parent();         print("child ouput\n");     }else{         print("parent ouput\n");         tell_child(pid);//这里父进程先运行     }     exit(0); }

parent ouput
按 来关闭窗口…//因为父进程先退出了
child ouput

原创粉丝点击