当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>C++基础入门教程

Tips: fork后的父子进程启动顺序控制

    Unix下进程fork子进程后,父进程和子进程的调度先后顺序是不确定的。
    Unix提供了vfork()系统调用,可以保证子进程一定在父进程之前执行,不知道为什么没有提供一个系统调用来保证父进程的先发执行。
    我用了一种方法,尝试实现父子进程的启动顺序控制,但是没有经过详细的测试,对于稳定性还有待考验
    主要使用了sigset_t数据结构以及涉及的5个操作函数还有sigsuspend函数


    文件p_sync.h,提供两个函数实现
    #ifndef P_SYNC_H
    #define P_SYNC_H

    #include <sys/types.h>
    #include <unistd.h>
    #include <signal.h>
    extern void wait_p()
    {
             sigset_t sigmask;
             sigfillset(&sigmask);
             sigdelset(&sigmask,SIGUSR1);
             sigsuspend(&sigmask);  //设置进程只能接收SIGUSR1信号,并且挂起
    }

    extern void tell_p(pid_t pid)
    {
             kill(pid,SIGUSR1);    //向指定进程发送SIGUSR1信号
    }
    #endif

    用到的几个函数sigfillset sigemptyset sigaddset sigdelset sigismember是对sigset_t的操作函数
    sigsuspend函数可以临时设置进程的信号屏蔽字为sigmask,并且挂起进程,直到收到一个它可以收到的进程信号后返回
    至于sigprocmask函数,可以控制进程的信号屏蔽字,但是我没有搞清在这种应用场景下有什么作用,但是在Unix环境高级编程一书里都用使用

    函数的使用
    If ((pid=fork())==0)
    {
             wait_p();   //等待,直到父进程发送信号
             do_child_things();
    }else
     {
             do_parent_things();
             tell_p();     //唤醒子进程。
    }

 

相关内容
赞助商链接