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(); //唤醒子进程。
}