我在玩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