需求
从父进程开始从0开始数数:
父进程数0
子进程数1
父进程数2
子进程数3
。
。
。
实现示意图
代码
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
void pdo_sigusr1(int sig, siginfo_t *siginfo, void *p)
{
static int sum = 0;
printf("p sum = %d\n", sum);
sum += 2;
//printf("sig = %d, in parent, send pid = %d, self pid = %d\n", sig, siginfo->si_pid, getpid());
sleep(1);
kill(siginfo->si_pid, SIGUSR2);
}
void cdo_sigusr2(int sig, siginfo_t *siginfo, void *p)
{
static int sum = 1;
printf("c sum = %d\n", sum);
sum += 2;
//printf("sig = %d, in child, send pid = %d, self pid = %d\n", sig, siginfo->si_pid, getpid());
sleep(1);
kill(siginfo->si_pid, SIGUSR1);
}
int main(int argc, char *argv[])
{
struct sigaction act;
pid_t pid = fork();
if (pid > 0)
{
//in parent
printf("child pid = %d\n", pid);
act.sa_sigaction = pdo_sigusr1;
sigemptyset(&act.sa_mask);
act.sa_flags = SA_SIGINFO;
sigaction(SIGUSR1, &act, NULL);
}
else if (pid == 0)
{
//in child
printf("parent pid = %d\n", getppid());
act.sa_sigaction = cdo_sigusr2;
sigemptyset(&act.sa_mask);
act.sa_flags = SA_SIGINFO; //SA_SIGINFO:使用sa_sigaction,0: 使用sa_handler
sigaction(SIGUSR2, &act, NULL);
kill(getppid(), SIGUSR1);
}
else
{
perror("fork");
exit(1);
}
while(1)
sleep(1);
return 0;
}