gpt4 book ai didi

c - SIGCHLD 导致段错误,未进入处理程序

转载 作者:行者123 更新时间:2023-11-30 17:26:07 26 4
gpt4 key购买 nike

我正在尝试制作一个简单的 shell,并添加功能以使用 & 在后台运行进程。在我的主要方法中我基本上有:

int main() {
if (signal(SIGCHLD, handle) == SIG_ERR)
perror("Cannot catch SIGCHLD");
pid_t child = fork();
if (child == 0)
execvp(command, arguments);
else {
if (background == 1) {
printf("1");
backgroundList(command, child);
printf("2"); }
else
waitpid(child, NULL, 0);
}
}

对于我的处理程序,我有:

void handle(int s) {
printf("a");
if (signal(SIGCHLD, handle) == SIG_ERR)
perror("Cannot catch SIGCHLD");
pid_t pid;
printf("b");
while((pid = waitpid(0, NULL, WNOHANG)) > 0) {
printf("c");
rmBackgroundList(pid);
printf("d");
}
}

我可以让它在前台运行一个进程就好了。运行“ls”会将内容打印到屏幕上,然后打印“a”和“b”,因为它进入SIGCHLD处理程序,但它不会进入“c”,因为它已经被等待了。

但是,在后台运行某些内容(“ls&”)将打印“1”和“2”,让父级返回到提示符,然后子级将把内容打印到屏幕上,然后出现段错误。它不会打印我在处理程序中的任何字母。

我不明白为什么 SIGCHLD 对于已经等待的子进程有好处,但会导致段错误,甚至永远不会进入未等待的进程的处理程序。

最佳答案

您没有遵守信号处理程序的规则。您不能使用 printf()perror()Read the rules on what is safe to do in a signal handler.

此外,signal() 的行为也会根据它是 BSD 还是 SysV 风格的 Unix 而变化。 Linux 根据 _BSD_SOURCE 或 _GNU_SOURCE 的存在来更改其在 glibc 中的行为,并且该行为的变化取决于您是否调用 gcc -ansigcc -std=c99gcc -std=gnu99

您确实应该使用 sigaction() 而不是 signal()

关于c - SIGCHLD 导致段错误,未进入处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26870686/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com