[英]I'm confused how this execvp() is handled in this sample function which uses fork() to clone a process
我從一本名為“高級Linux編程”的書中獲得以下功能。
int spawn (char* program, char** arg_list)
{
pid_t child_pid;
/* Duplicate this process. */
child_pid = fork ();
if (child_pid != 0)
/* This is the parent process. */
return child_pid;
else {
/* Now execute PROGRAM, searching for it in the path. */
execvp (program, arg_list);
/* The execvp function returns only if an error occurs. */
fprintf (stderr, “an error occurred in execvp\n”);
abort ();
}
}
但是我感到困惑的是,在成功執行ls
情況下,不會打印錯誤,但是在失敗的情況下,它會打印錯誤並放置在其后一行。
我的問題這行fprintf (stderr, “an error occurred in execvp\\n”);
是在execvp()
函數之后,並且有望在execvp()
的執行完成后執行,但是不是這種情況,只有在execvp()
遇到錯誤時才執行。 似乎函數spawn()
一旦成功執行execvp()
完成了。 我對嗎?
您可以查看execvp
的聯機幫助頁,其中顯示:
exec()系列函數將當前過程映像替換為新的過程映像。
那是什么意思呢? 這意味着,如果execvp
成功,則您的程序將不再在內存中,因此將永遠不會出現錯誤消息。 您內存中的程序將被新程序替換(如果我正確理解,則為ls
)。
因此,如果您的程序能夠到達錯誤消息打印輸出,則execvp
函數將失敗。 否則,其他程序將開始執行。
您的程序將繼續運行的原因是fork
命令,該命令創建了進程映像的副本,因此您將同時運行兩個相同的進程,其中只有一個將被您嘗試執行的命令替換。 這是通過if
子句if (child_pid != 0)
,因為fork
命令將復制該進程並返回新的Process ID( PID
)。 如果將其設置為0
(請參見man 3 fork
),則其為新的子進程,如果其!= 0
為其父進程。 您的函數僅在其子進程,父進程遇到早期返回時才執行execvp
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.