C &引用;“闹钟”;代码第一次循环后的中断

C &引用;“闹钟”;代码第一次循环后的中断,c,linux,terminal,signals,interruption,C,Linux,Terminal,Signals,Interruption,这个无限程序创建两个子进程,在while()循环中设置一个报警()3秒钟,然后向两个子进程发送信号,以便它们打印出一些内容。当我执行时,代码的第一个循环工作,其中一个子进程打印一些东西,但随后我在终端中得到“闹钟”中断,这是为什么?(最后检查while循环,我认为问题就在那里) #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 无效通道(int); 无效AB(int); 文学士(内部); 布尔ab=假; int-pid[2]; int i=1; 无效通道(int符号)//handl

这个无限程序创建两个子进程,在while()循环中设置一个报警()3秒钟,然后向两个子进程发送信号,以便它们打印出一些内容。当我执行时,代码的第一个循环工作,其中一个子进程打印一些东西,但随后我在终端中得到“闹钟”中断,这是为什么?(最后检查while循环,我认为问题就在那里)

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
无效通道(int);
无效AB(int);
文学士(内部);
布尔ab=假;
int-pid[2];
int i=1;
无效通道(int符号)//handler
{
printf(“Voiture%d passée\n”,i);i++;ab=!ab;
}
无效AB(内部信号)
{
如果(ab==false)
{
printf(“feu1:ROUGE | feu2:VERT\n”);ab=!ab;
}
}
无效BA(内部信号)
{
如果(ab==true)
{
printf(“feu1:VERT | feu2:ROUGE\n”);
}
}
int main()
{ 
结构动作;
action.sa_handler=通道;
sigaction(SIGALRM,&action,NULL);
int-fd[2];
如果(管道(fd)=-1){printf(“管道错误”);返回1;}
pid[0]=fork();
如果(pid[0]!=-1)
{
如果(pid[0]==0)
{
关闭(fd[0]);
布尔伊;
读取(fd[0],&y,sizeof(_Bool));
关闭(fd[0]);
//代码du child 1
printf(“test1\n”);
信号(SIGUSR1,AB);
而(1),;
}否则
{
pid[1]=fork();
如果(pid[1]==0)
{
//代码儿童2
printf(“test2\n”);
信号(SIGUSR2,BA);
而(1),;
}否则
{
//父前体
//3秒钟后给两个孩子发信号
printf(“PONT OUVERT\n”);
关闭(fd[0]);
写入(fd[1],&ab,sizeof(_Bool));
关闭(fd[1]);
而(1)
{ 
警报(3);
暂停();
kill(pid[0],SIGUSR1);
压井(pid[1],SIGUSR2);
}
while(wait(NULL)!=-1);//gcc test.c-o test
}
}}
}

考虑在第一个子流程中指出关闭(fd[0])而不是关闭(fd[1])的注释

但是主要的问题来自于您没有正确初始化“sigaction”结构这一事实。必须将其重置,否则字段中会有垃圾值:

   struct sigaction action;
   memset(&action, 0, sizeof(action));
   action.sa_handler = passage;
   sigaction(SIGALRM,&action,NULL);
您的代码中还有其他问题:

。子进程之间不共享“ab”全局变量。因此,当您在第一个子项中修改它时,第二个子项看不到修改


。“while(1);”循环占用太多CPU。您应该添加一个暂停:while(1)pause()

讨论
wait(NULL)
行为。您
close(fd[0])
紧接着是
read(fd[0])
。也许你有一个打字错误。非常感谢你的回答!我试着像你说的那样保留记忆,但效果很好,在任何地方都找不到答案,所以谢谢。说到全局变量,这实际上是一个更大的问题,哈哈,我正在尝试使用管道使其工作。我感谢你的帮助。
   struct sigaction action;
   memset(&action, 0, sizeof(action));
   action.sa_handler = passage;
   sigaction(SIGALRM,&action,NULL);