【发布时间】:2016-07-31 15:08:09
【问题描述】:
我正在学习如何在 linux 中使用信号。有4个子进程和1个父进程。我的输出应该分为以下几个阶段:
父母收到孩子 1 的信号
父母收到来自孩子 2 的信号
父母收到孩子 3 的信号
父母收到来自孩子 4 的信号
初始化结束
第一阶段开始
孩子 1 收到来自父母的信号
孩子 2 收到来自父母的信号
孩子 3 收到来自父母的信号
孩子 4 收到来自父母的信号
父母收到孩子 1 的信号
父母收到来自孩子 2 的信号
父母收到孩子 3 的信号
父母收到来自孩子 4 的信号
第一阶段结束
第二阶段开始
孩子 1 收到来自父母的信号
孩子 2 收到来自父母的信号
孩子 3 收到来自父母的信号
孩子 4 收到来自父母的信号
我目前正在尝试在第 1 阶段结束之前完成这部分工作,但我正在苦苦挣扎。这是我的代码:
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#define MAXCP 3
int ccount=0;
void p_action(int sig){
if (sig == SIGUSR2){
printf("\ncontroller(%d): Received signal SIGUSR2 from child process\n",
(int)getpid());
}
--ccount;
}
void c_action(int sig){
if (sig == SIGUSR1){
printf("\ncompute(%d): Received signal SIGUSR1 from parent process %d\n",
(int)getpid(), (int)getppid());
}
exit(0);
}
int main(){
pid_t pid[MAXCP], parent_pid;
//int nprocs = 0;
ccount = MAXCP;
static struct sigaction pact, cact[MAXCP];
pact.sa_handler = p_action;
sigaction(SIGUSR2, &pact, NULL);
int count;
for (count = 0; count < MAXCP; count++){
switch(pid[count] = fork()){
case -1:
perror("Fork error");
exit(1);
case 0:
//sleep(1);
cact[count].sa_handler = c_action;
sigaction(SIGUSR1, &cact[count], NULL);
printf("Sending SIGUSR2 to parent");
kill(getppid(), SIGUSR2);
pause();
break;
default:
pause();
//printf("Parent is sleeping");
while (ccount != MAXCP){
sleep(60);
}
for (ccount = 0; ccount < MAXCP; ccount++)
kill(pid[count], SIGUSR1);
break;
}
}
return 0;
}
我的输出是这样的:
// When I use the above code
controller(3132): Received signal SIGUSR2 from child process
// When I comment out the pause in the child section
controller(3140): Received signal SIGUSR2 from child process
Sending SIGUSR2 to parent
controller(3141): Received signal SIGUSR2 from child process
Sending SIGUSR2 to parentSending SIGUSR2 to parentSending SIGUSR2 to parentSending SIGUSR2 to parentSending SIGUSR2 to parent
controller(3142): Received signal SIGUSR2 from child process
^C
感谢您的宝贵时间。
【问题讨论】:
-
--ccount;未定义,您只能在信号处理程序中使用volatile sig_atomic_t对象。在最坏的情况下,您的信号处理程序会修改ccount != MAXCP中间的字节或它的任何其他用途,或者同样邪恶的东西。 -
我放入 volatile sig_atomic_t 和 II 仍然得到相同的结果。
-
并不意味着作为解决方案,只是指出这是未定义的行为,现在或以后可能会导致整体怪异。
-
那么我该怎么做才能同步呢?
-
afaik 你不能同步信号:在孩子和父母中顺序发送和接收信号似乎不合适。您甚至无法确定孩子和父母的执行顺序