c/c++语言开发共享C中的测试用例,用于WIFSIGNALED,WIFSTOPPED,WIFCONTINUED

我正在使用waitpid()和signal(),我正在寻找可靠的测试用例,用于返回WIFSIGNALED(状态)= WIFSTOPPED(状态)= WIFCONTINUED(状态)= true但找不到任何…

小心告诉我如何确保返回true,以便我可以调试我的代码?

另外,关于我应该用signal()检测哪些信号以测试这些宏的一些提示会有所帮助……

    #include  #include  #include  #include  #include  #include  #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%sn", i, WIFCONTINUED(status) ? " CONTINUED" : "", WIFSIGNALED(status) ? " SIGNALED" : "", WIFSTOPPED(status) ? " STOPPED" : ""); } return 0; } 

    处理WIFSIGNALED很容易。 子进程可以使用kill()系统调用自杀。 您还可以检查核心转储 – 一些信号创建它们(SIGQUIT,IIRC); 有些信号没有(SIGINT)。

    处理WIFSTOPPED可能会更难。 尝试的简单步骤是让孩子再次使用kill()系统调用向自己发送SIGSTOP。 实际上,我认为应该有效。 请注意,您可能需要检查SIGTTIN和SIGTTOU以及SIGTSTOP – 我相信它们会计入WIFSTOPPED。 (当调试器将其发送到通过非POSIX系统调用ptrace()运行的进程时,SIGSTOP也有可能只能正常工作。)

    处理WIFCONTINUED是我认为父母必须做的事情; 在您检测到进程已停止后,您的调用代码应通过向其发送SIGCONT信号(再次使用kill()继续进行。 孩子不能自己提供; 它已被停止。 再说一遍,我不确定是否还有额外的皱纹需要担心 – 可能。

    类似下面的框架将允许您检查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 – “ man -s7 signal ”会给你一个信号的默认信息行为。

    对于您提到的宏,使用SIGSTOP作为WIFSTOPPED(status) ,使用SIGCONT作为WIFCONTINUED (status)SIGINT作为WIFSIGNALED(status)

    如果您想要更灵活的测试,可以使用kill(参见“ man kill ”)向您的进程发送信号。 kill -l将列出可以发送的所有信号。

    在您的测试中,您可以fork()并向您的子进程发送特定信号? 在这种情况下,您的子进程是测试用例吗?

    编辑

    我的答案是关于编码C测试。 你分叉,得到你的子进程的pid(安装了信号处理程序的进程),然后你可以使用kill(2)向它发送信号。 通过这种方式,您可以测试退出状态

      以上就是c/c++开发分享C中的测试用例,用于WIFSIGNALED,WIFSTOPPED,WIFCONTINUED相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/544904.html

      (0)
      上一篇 2021年1月9日
      下一篇 2021年1月9日

      精彩推荐