簡體   English   中英

我很困惑在這個使用fork()克隆進程的示例函數中如何處理execvp()

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM