问题标签 [sigchld]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - C - 在什么情况下调用 waitpid() 返回 -1,表示错误?
我正在编写一个 SIGCHLD 处理程序,我想知道在什么情况下调用 waitpid() 会返回 -1?
更具体地说,如果我创建一个循环,在其中调用 waitpid(...) 并希望它运行直到所有终止的子进程都被收割,我是否会迭代直到 waitpid(...) 返回 -1?否则,我怎么知道还有没有孩子需要收割呢?
c - 如何获取死子进程的 PID 并在父进程中使用它?
我正在尝试制作一个 C 程序(用于 FreeBSD、Unix),它在循环中创建 4 个子进程。每个孩子都会做一些事情,当他们死后,他们会立即被其他孩子取代。所以,最后,我有 4 个孩子一直在工作。
每个子 PID 都必须在一个表中注册,并且在它们死后,必须删除该表的 PID。这是我遇到麻烦的部分。
所以在第一次尝试中,我尝试创建一个处理程序,它将死孩子的 PID 发送到全局变量:
然后我在父级中使用它从表中删除死去的孩子的 PID。但后来我意识到,如果两个孩子同时死亡,其中一个 PID 将被另一个覆盖。
我怎样才能避免这种情况?
c - 如何处理 SIGHLD
我在使用 sigchld 时遇到了一些麻烦...
我想要做的是用fork创建一个子进程并使子进程打印并休眠几次......在这些过程中我想向孩子发送信号(SIGSTOP和SIGCONTINUED)并且我想要父母打印信号是什么......这是我的代码:
但它不起作用,因为当我向孩子发送 SIGSTOP 或 SIGCONTINUED 时,孩子停止并继续但父母不打印任何东西
有什么建议吗?
c - 如果我设置信号(SIGCHLD,SIG_IGN);避免僵尸 - system() 返回 -1 和“无子进程”
我有一个简单的服务器,它为新的套接字连接分叉。如果我signal(SIGCHLD, SIG_IGN);
在调用子进程以执行所需的脚本时设置避免僵尸system()
- 一切都执行得很好,但似乎子进程在退出之前从进程表中删除,所以这很奇怪。以下是输出示例:
c - 父进程不会等待所有子进程使用 signal() 退出
该程序最初要求用户输入要创建的子进程的数量。创建孩子后,父母会休眠并等待其所有孩子通过使用 SIGCHLD 注册的信号处理函数“handle_child”终止。
我面临的问题是父母经常在没有收获所有孩子的情况下退出。有时程序运行得很好,有时却突然结束。这里到底发生了什么?
错误输出的实例之一:
linux - Proper way of handling SIGCHLD, EINT, and accept() in Linux
I have a program that creates a TCP server. When the accept() connects to a client, I fork() it and handle the connection. When that client leaves it calls the waitpid() because of the SIGCHLD, but this causes a EINTR in the accept(). My question is how should this be handled? I've read so many different ways.
Most say to ignore it the EINT and try the accept() again. I've even seen a macro to do just that: TEMP_FAILURE_RETRY(). Some say to set the sigaction flags SA_RESTART and SA_NOCLDSTOP. I've tried that and it introduces other errors (errno = ECHILD). Also, how should the child exit? I've seen both _exit(0) and exit(0).
The SIGCHLD handling is:
c - 为什么我们通常忽略 SIGCHLD
我正在研究信号并通过此链接
https://en.wikipedia.org/wiki/Child_process#cite_note-1
这就是它所说的:“SIGCHLD 信号在子进程退出、中断或中断后恢复时被发送到父进程。默认情况下,该信号被简单地忽略”
我们有什么理由忽略 SIGCHLD。
c - Waitpid 被系统调用中断
我正在分叉一个子进程以使用execve
. 我正在安装和定义 3 个信号处理程序:SIGCHLD、SIGINT 和 SIGSTP,如下所示:
现在,当我运行一个进程并将其放入后台(ctrl z)循环(100 次)时,在大多数情况下我会收到错误:waitpid error: Interrupted system call
为什么我会得到这个?
c - 当 SIGCHLD 在简单的 shell 程序中被捕获时的 Seg Fault
更新:当我设置 act.sa_flags = SA_RESTART 时,程序会停止段错误,但是它会导致程序“卡在”该函数中,因为它不会按照我的程序中的逻辑前进。冒号表示新命令行输入的开始。理想的输出如下:
但是我现在得到以下信息:
上一个: 我正在尝试用 C 语言编写一个带有后台和前台进程的简单 shell。为了创建后台进程,用户必须在命令末尾输入一个“&”,例如“sleep 3 &”将是一个后台进程。在我的程序中,当我输入“sleep 3 &”时,进程成功运行,但在调用 sig 处理函数时完成后打印一条语句(表明后台进程已结束),然后程序段出错。这是输出的示例:
:睡眠 3 和后台 pid 为 22688:后台 pid 0 已完成:由信号 0 终止 分段错误:11
当我尝试运行后台进程时会调用我的信号处理程序,但我不确定为什么。当我将 sigaction 设置为使用 SIGINT 时,程序不会出现段错误。有什么想法吗?我在这里看到了一个类似的帖子(SIGCHLD 导致分段错误,而不是进入处理程序),但这对我没有帮助。
bash - BASH 脚本在完成前退出
我有一个很长的 bash 脚本,做了很多事情来达到这一点......
(在案例陈述的末尾)...
在这一点上,它只是死了,没有输出到标准输出。我使用 strace -f 运行,以下是相关结果:
我不确定这个字符串 ' read(255, "exit 0... ' 是否是罪魁祸首,我也无法确定它为什么突然退出。它确实继续前进并在它死之前短暂尝试执行解压缩操作。如果任何人都有任何想法,他们将不胜感激。