在pong中,代码返回错误打印。 我知道我对信号还不太了解,所以我绝对不知道这里出了什么问题。
据我了解,Sigaction在以下情况下返回-1:
由于SIGUSR1是用户定义的信号,因此我看不到为什么无法捕获或忽略它。另外,我还没有接触过SA_SIGINFO,因此除非将其默认设置为无效设置,否则我将不明白为什么会这样。
我的项目大纲指出,我需要在pong()函数(而不是main)中“设置信号处理程序以调用处理程序函数”。但是,Main应该在结束之前发送信号。信号功能应仅打印“ pong结尾”并退出以打破pong内部的无限循环。
编辑3:主要方法是不发送信号到pong()
并且代码被挂起。
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
int ping();
int pong();
void handle_SIGUSR1(int signum);
int fdA[2];
int fdB[2];
int ppid;
int ping ()
{
close(fdA[0]);
close(fdB[1]);
int i = 0, check = 0;
printf("ping - %d\n", i);
write(fdA[1], &i, sizeof(int));
while (i < 18)
{
read(fdB[0], &i, sizeof(int));
i++;
printf("ping - %d\n", i);
write(fdA[1], &i, sizeof(int));
}
close(fdA[1]);
close(fdB[0]);
exit(0);
return 0;
}
int pong()
{
ppid = getpid();
struct sigaction sa;
sigemptyset(&sa.sa_mask);
sa.sa_handler = handle_SIGUSR1;
sa.sa_flags = 0;
if (sigaction(SIGUSR1, &sa, NULL) == -1)
{
printf("error -> sigaction err\n");
}
int j = 0;
while (1)
{
read(fdA[0], &j, sizeof(int));
j++;
printf("pong - %d\n", j);
write(fdB[1], &j, sizeof(int));
}
}
void handle_SIGUSR1(int signum)
{
printf("Pong ending...\n");
exit(0);
}
int main ()
{
if (pipe(fdA) == -1 || pipe(fdB) == -1)
return 1; // pipe initialization error
int pid = fork();
if (pid == 0)
{
ping();
}
else
{
ppid = getpid();
pong();
}
kill(ppid, SIGUSR1);
}
将我的评论的要点转化为答案。
sigaction()
仔细研究POSIX规范。
问题的一部分可能是您尚未设置信号掩码sa.sa_mask
,因此它是随机垃圾,并且推测随机垃圾是不可接受的。sigemptyset(&sa.sa_mask);
在致电之前写信可能会解决问题-如果我的分析正确,它将解决问题。基本上,您应该确保已正确/彻底地初始化了结构。即使这不是造成问题的原因,也应始终设置遮罩。阻止一组随机信号不是一个好主意。您应该知道要阻止的内容,因此可以使用sigemptyset()
或sigfillset()
应该使用它来设置掩码-否则可以确保在struct sigaction
创建结构时将其清零。
(类似地,您应该确保sa_flags
也正确设置了成员-有关正确设置结构的先前观点的一部分。NateEldridge在此答案中指出。您应只设置sa_handler
和之一sa_sigaction
,具体取决于是否设置SA_SIGINFO
了的sa_flags
。)
但是,您还有另一个更大的问题。好好看一下下面的if
语句:
if (sigaction(SIGUSR1, &sa, NULL) == -1);
分号在做什么?不要在这里放分号;这意味着无条件执行之后的代码块。
请注意,应该将错误写入stderr
,并且您可以考虑使用perror()
或使用errno
和strerror()
报告错误消息(可能还有错误编号)。但是分号是主要问题。您仍应确保传递给的结构sigaction()
已完全初始化。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句