你好我有问题,在我的第二个程序获得信号。我有这样的代码:
程序1:
int main() {
int id = fork();
if (id == 0) {
execl("program2", "program2", NULL);
kill(id, SIGUSR1);
}
return 0;
}
方案二:
void signal_handler1(int sig) {
printf("test\n");
}
int main(int argc, char* argv[]) {
signal(SIGUSR1, signal_handler1);
printf("Hello world\n");
return 0;
}
为什么我得到
Hello World
代替
test
Hello World
2条答案
按热度按时间ryevplcw1#
execl()
仅在发生错误时返回,因此如果execl()
成功,则kill()
不会在program1
中执行。它应该在父进程中发送信号。但信号可能在program2
设置信号处理程序之前发送,因此信号可能被忽略。让它等待一段时间后再发送信号:如果你想让
program2
捕捉信号,让它等待信号:qgelzfjb2#
查看您的父代码:
id
是否为负(表示fork()
中存在错误),但由于此错误很少见,因此在此处不构成问题)id
是否为零(就在上面),所以请三思,您是否正在终止进程id为0
的进程???此终止不应该在代码的其他部分吗?execl()
只有在确实失败时才会传回。您应该只打印一些关于execl()
失败原因的错误,以及exit()
,并以传回码指出失败的原因。Exec函数永远不会返回,因为执行它们的程序会被你试图执行的程序覆盖。所以,如果你调用
execl(2)
,不要在它下面放任何东西,只放错误代码。这不像调用子例程,它会返回到调用程序。它永远不会返回(正如前面所说,只有当函数失败时)。如果要向子进程发送信号,则
kill()
调用应该在if
语句之后(其中确实是要执行的父代码)。您应该首先检查-1
,因为这意味着fork()
失败。因此,更好的示例代码应该是:(我已经放了一个完整的例子,准备在你的网站上构建和执行,请阅读How to create a minimal, reproducible example,并遵循那里的指导方针来发布可测试的代码。(你缺少头文件和许多东西来测试这个代码)
program1.c
program2.c
这两个计划都需要:
log.h
您可以使用以下内容进行构建:
Makefile
对于运行为: