我在玩waitpid =真,但找不到任何...用于WIFSIGNALED,WIFSTOPPED,WIFCONTINUED的测试用例
小心告诉我如何确保那些返回true,以便我可以调试我的代码?
此外,关于我应与信号()来测试这些宏将是有益的捉什么信号的一些提示...
我在玩waitpid =真,但找不到任何...用于WIFSIGNALED,WIFSTOPPED,WIFCONTINUED的测试用例
小心告诉我如何确保那些返回true,以便我可以调试我的代码?
此外,关于我应与信号()来测试这些宏将是有益的捉什么信号的一些提示...
#include <errno.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
#define NELEMS(x) (sizeof (x)/sizeof (x)[0])
static void testsignaled(void) {
kill(getpid(), SIGINT);
}
static void teststopped(void) {
kill(getpid(), SIGSTOP);
}
static void testcontinued(void) {
kill(getpid(), SIGSTOP);
/* Busy-work to keep us from exiting before the parent waits.
* This is a race.
*/
alarm(1);
while(1) {}
}
int main(void) {
void (*test[])(void) = {testsignaled, teststopped, testcontinued};
pid_t pid[NELEMS(test)];
int i, status;
for(i = 0; i < sizeof test/sizeof test[0]; ++i) {
pid[i] = fork();
if(0 == pid[i]) {
test[i]();
return 0;
}
}
/* Pause to let the child processes to do their thing.
* This is a race.
*/
sleep(1);
/* Observe the stoppage of the third process and continue it. */
wait4(pid[2], &status, WUNTRACED, 0);
kill(pid[2], SIGCONT);
/* Wait for the child processes. */
for(i = 0; i < NELEMS(test); ++i) {
wait4(pid[i], &status, WCONTINUED | WUNTRACED, 0);
printf("%d%s%s%s\n", i, WIFCONTINUED(status) ? " CONTINUED" : "", WIFSIGNALED(status) ? " SIGNALED" : "", WIFSTOPPED(status) ? " STOPPED" : "");
}
return 0;
}
在您的测试,你可以fork()和发送特定的信号,以你的子进程?在这种情况下你的子进程是测试用例吗?
编辑
我的答案是关于编码一个C测试。你分叉,得到你的子进程的PID(安装了信号处理程序的进程 ),然后你可以使用kill(2)
发送信号给它。 通过这种方式,您可以测试退出状态
类似于下面的框架将允许您检查wait()
和waitpid()
调用的结果。
pid_t pid = fork();
if (pid == 0) {
/* child */
sleep(200);
}
else {
/* parent */
kill(pid, SIGSTOP);
/* do wait(), waitpid() stuff */
}
您实际上不必捕获发送的信号(使用signal()
或相关函数)。 signal()
会安装一个处理程序来覆盖特定信号的默认行为,因此如果您想检查终止处理的信号,请选择一个具有该默认行为的信号 - “man -s7 signal
”会为您提供信号默认行为的详细信息。
对于你所提到的使用SIGSTOP
为WIFSTOPPED(status)
宏,SIGCONT
为WIFCONTINUED (status)
和SIGINT
为WIFSIGNALED(status)
如果你想测试更多的灵活性,你可以使用kill(见“man kill
”)发送信号到你的过程。 kill -l
将列出所有可以发送的信号。
处理WIFSIGNALED很简单。子进程可以通过系统调用进行自杀。您也可以检查核心转储 - 一些信号创建它们(SIGQUIT,IIRC);一些信号不(SIGINT)。
处理WIFSTOPPED可能会更困难。尝试的一个简单步骤是让孩子再次发送自己的SIGSTOP和kill()
系统调用。其实,我认为这应该起作用。请注意,您可能需要检查SIGTTIN和SIGTTOU以及SIGTSTOP - 我相信它们会计入WIFSTOPPED。 (也有可能SIGSTOP只在调试器发送到它通过非POSIX系统调用ptrace()
运行的进程时才能正常运行。)
处理WIFCONTINUED是我认为父级必须执行的操作;在检测到进程已停止后,您的调用代码应该通过发送一个SIGCONT信号来继续(kill()
)。孩子不能自己提供;它已经停止。再次,我不确定是否有额外的皱纹担心 - 可能。
当然我已经有了,我正在寻找具体的信号,哪一个会产生哪个宏等于真...我如何通过bash将它们发送到特定的过程,以便我可以测试它们,这就是我想知道的。 – 2009-05-25 23:11:41
通过使用kill(1),man 1 kill获取更多信息 – dfa 2009-05-25 23:44:19