我是Linux和IPC的新手,所以请多多包涵。 我陷入了一个家庭作业问题,需要创建双向通讯系统,即:
1. Parent sends SIGUSR1 to multiple (1 to 10) children
2. Children all respond with SIGUSR2 to parent
3. If all SIGUSR2 signals are collected, parent pauses for 1 second
4. Repeat from [1], until SIGTERM is sent to parent
目前,我正试图仅让一个孩子使用它,我需要使用Parent ..和ChildHandler函数来处理获取的信号。
我尝试将初始SIGUSR1发送给子级,然后使用ChildHandler将其 kill(getppid(),SIGUSR)发送给父级,但这并没有达到我的预期。在父级开始等待之前,ChildHandler似乎没有收到信号。
ParentHandler(int signo):
if (signo == SIGUSR2)
{
printf("P received SIGUSR2\n");
printf("Waiting for %d sec...\n\n", WAIT_TIME);
sleep(WAIT_TIME);
return;
}
else
{
printf("Something went wrong in PH...\n\n");
exit(1);
}
ChildHandler(int signo):
if (signo == SIGUSR1)
printf("C received SIGUSR1\n");
kill(getppid(), SIGUSR2); // P <--SIGUSR2--- C
return;
主要:
pid_t pid, ppid;
ppid = getpid();
// Subscribe parent to SIGTERM
// signal(SIGTERM, SigTermParentHandler);
// Parent <--> Child dialogue
if ((pid = fork()) != 0) // Parent
{
printf("P: %d | C: %d\n\n", ppid, pid);
if (signal(SIGUSR2, ParentHandler) == SIG_ERR)
printf("SIGUSR2 to parent was interrupted!");
while (1)
{
printf("P ---SIGUSR1--> C\n");
kill(pid, SIGUSR1); // P ---SIGUSR1--> C
}
}
else // Child
{
sleep(WAIT_TIME); // Wait for parent to finish setting up
if (signal(SIGUSR1, ChildHandler) == SIG_ERR)
printf("SIGUSR1 to child was interrupted!");
}
我希望输出接近以下内容:
Parent PID is: 13918
P: 13918 | C: 13919
P ---SIGUSR1--> C
C received SIGUSR1
P <--SIGUSR2--- C
P received SIGUSR2
Waiting for 1 sec...
P ---SIGUSR1--> C
...
答案 0 :(得分:0)
我认为这里发生的是孩子在等待时收到信号。 将“ signal(SIGUSR1,ChildHandler)”放在睡眠调用上方应该可以解决此问题。