• 进程同步


    #include "apue.h"

    static volatile sig_atomic_t sigflag; /* set nonzero by sig handler */
    static sigset_t newmask, oldmask, zeromask;

    static void
    sig_usr(int signo)   /* one signal handler for SIGUSR1 and SIGUSR2 */
    {
        sigflag = 1;
    }

    void
    TELL_WAIT(void)
    {
        if (signal(SIGUSR1, sig_usr) == SIG_ERR)
            err_sys("signal(SIGUSR1) error");
        if (signal(SIGUSR2, sig_usr) == SIG_ERR)
            err_sys("signal(SIGUSR2) error");
        sigemptyset(&zeromask);
        sigemptyset(&newmask);
        sigaddset(&newmask, SIGUSR1);
        sigaddset(&newmask, SIGUSR2);

        /*
         * Block SIGUSR1 and SIGUSR2, and save current signal mask.
         
    */
        if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)
            err_sys("SIG_BLOCK error");
    }

    void
    TELL_PARENT(pid_t pid)
    {
        kill(pid, SIGUSR2);              /* tell parent we're done */
    }

    void
    WAIT_PARENT(void)
    {
        while (sigflag == 0)
            sigsuspend(&zeromask);   /* and wait for parent */
        sigflag = 0;

        /*
         * Reset signal mask to original value.
         
    */
        if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
            err_sys("SIG_SETMASK error");
    }

    void
    TELL_CHILD(pid_t pid)
    {
        kill(pid, SIGUSR1);             /* tell child we're done */
    }

    void
    WAIT_CHILD(void)
    {
        while (sigflag == 0)
            sigsuspend(&zeromask);  /* and wait for child */
        sigflag = 0;

        /*
         * Reset signal mask to original value.
         
    */
        if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
            err_sys("SIG_SETMASK error");
    }
  • 相关阅读:
    【Unity3d】Ray射线初探-射线的原理及用法
    unity3d 的Quaternion.identity和transform.rotation区别是什么
    HOLOLENS的空间管理
    vector3.forward和transform.forward的区别!
    voxel 与 pixel
    图文详解Unity3D中Material的Tiling和Offset是怎么回事
    手机开启HDR后拍照有什么不同?
    什么是UV?
    积和式Permanent在Mathematica中的运算
    [再寄小读者之数学篇](2014-11-20 计算二重积分)
  • 原文地址:https://www.cnblogs.com/hbt19860104/p/2626401.html
Copyright © 2020-2023  润新知