1
嗨我正在從高級編程Unix系統的一些練習。我感興趣的是分叉和execlp功能的作品。從作者指定的文字分叉創建一個新的過程。它被父母和子女調用一次 - 由父母調用 - 但返回兩次。調試劣質進程
所以叉返回一個非負pid給父母,0給孩子。我想用GDB逐步調用這一系列調用,但是我的斷點會導致孩子不運行或中斷造成父母終止的系統調用。
1 - 如果我設置了一個斷點 - 否則if(pid == 0) - >該進程不運行。
2 - 如果我設置了一個斷點 - execlp(buf,buf,(char *)0);
我將得到以下錯誤:
waitpid函數錯誤:中斷系統調用 [劣質1(處理461)退出,代碼爲01]
做什麼選擇我都設置在GDB調試父母和孩子?應該在哪裏設置斷點?
int main(int argc, char *argv[])
{
char buf[MAXLINE];
pid_t pid;
int status;
printf("%% ");
while(fgets(buf, MAXLINE, stdin) != NULL)
{
if(buf[strlen(buf) - 1] == '\n')
buf[strlen(buf) - 1] = 0;
if((pid = fork()) < 0)
{
err_sys("fork error");
}
else if(pid == 0)
{
execlp(buf, buf, (char *)0);
err_ret("could'nt execute: %s", buf);
exit(127);
}
if((pid = waitpid(pid, &status, 0)) < 0)
err_sys("waitpid error");
printf("%% ");
}
exit(0);
}
感謝OznOg ......你的建議工程完全在我的Linux虛擬機,但它不工作時,我在OS X環境中。從文檔中我看到以下內容:「在大多數系統上,gdb沒有特別的支持來調試使用fork函數創建額外進程的程序。當程序分叉時,gdb將繼續調試父進程並且子進程不受阻礙地運行。如果你已經在任何代碼中設置了一個斷點,那麼這個孩子將會得到一個SIGTRAP信號(除非它捕獲到信號)將導致它終止。「 – dcrearer
不客氣,很遺憾地看到它在osX上無法正常工作。 – OznOg