Linux之进程控制

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有时需要偏执狂

请我喝咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值