概述
#include<stdio.h>
#include<signal.h>
#include <unistd.h>
void pdosig(int num ,struct __siginfo * _siginfo, void * ptr)
{
static int count = 0;
printf("I am parent ,pid is %d,the proc : %d send signal: %d to me count is: %dn",getpid(),_siginfo->si_pid,num,count);
count+=2;
sleep(1);
kill(_siginfo->si_pid,SIGUSR2);
}
void cdosig(int num,struct __siginfo * _siginfo, void * ptr)
{
static int count = 1;
printf("I am child ,pid is %d,the proc : %d send signal: %d to me count is: %dn",getpid(),_siginfo->si_pid,num,count);
count+=2;
sleep(1);
kill(_siginfo->si_pid,SIGUSR1);
}
int main()
{
struct
sigaction sig;
int pid = fork();
if(pid >0)
{
printf("i am father %dn",getpid());
sig.sa_sigaction = pdosig;
sigemptyset(&sig.sa_mask);
sig.sa_flags=0;
sigaction(SIGUSR1,&sig,NULL);
}
else
{
printf("i am child %dn",getpid());
sig.sa_sigaction = cdosig;
sigemptyset(&sig.sa_mask);
sig.sa_flags=0;
sigaction(SIGUSR2,&sig,NULL);
kill(getppid(),SIGUSR1);
}
while(1)
{
sleep(1);
}
return 0;
}
SIGUSR1和SIGUSR2是自定义信号量,我们可以利用两个信号来实现父子进程同步输出
int sigaction(int sig, const struct sigaction *restrict act, struct sigaction *restrict oact);函数来捕获信号,然后再利用KILL函数发送信号。从而实现同步。需要注意的是struct sigaction中的成员__sigaction_u是一个联合体,此处我们需要用第二个即sa_sigaction才行,因为此回掉函数提供的参数中一个结构体struct __siginfo,此结构体如下
typedef struct __siginfo { int si_signo; /* signal number */ int si_errno; /* errno association */ int si_code; /* signal code */ pid_t si_pid; /* sending process */ uid_t si_uid; /* sender's ruid */ int si_status; /* exit value */ void *si_addr; /* faulting instruction */ union sigval si_value; /* signal value */ long si_band; /* band event for SIGPOLL */ unsigned long __pad[7]; /* Reserved for Future Use */ } siginfo_t;
其中pid_t包含发送者的pid,因此我们可以根据发送者的pid使父子进程建立联系,实现同步输出
最后
以上就是害羞心锁为你收集整理的利用SIGUSR1和SIGUSR2实现父子进程同步输出的全部内容,希望文章能够帮你解决利用SIGUSR1和SIGUSR2实现父子进程同步输出所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复