簡體   English   中英

C表示子進程的父進程

[英]C signal parent process from child

我正在嘗試解決子進程運行execvp()並需要讓父進程知道是否返回的問題。 因此,在execvp()返回(由於出現錯誤)之后,如何告訴父級發生了此特定事件,以便它可以處理它。

有一種方法可以通過我正在使用的管道寫入文本字符串,然后從父級讀取文本。.但是似乎有點草率。 有沒有更好的辦法?

謝謝!

編輯:這是一些我正在嘗試似乎無法讀取返回的代碼。

int errorPipe[2];
signal( SIGPIPE, SIG_IGN );

int oldflags = fcntl (errorPipe[0], F_GETFD, 0);
oldflags |= FD_CLOEXEC;
fcntl (errorPipe[0], F_SETFD, oldflags);
oldflags = fcntl (errorPipe[1], F_GETFD, 0);
oldflags |= FD_CLOEXEC;
fcntl (errorPipe[1], F_SETFD, oldflags);

pipe( errorPipe );

// in the child..
char *error_message = "exec failed";
write( errorPipe[1], error_message, strlen(error_message)+1 );
exit(-1);

// in the parent
printf("read gives: %d\n", read(errorPipe[0], error_read, MAX_LINE_LENGTH) );

最簡單的方法是設置FD_CLOEXEC標志的管道,這樣您就可以像檢測失敗一樣容易地檢測到成功的exec。 如果發生故障,我會通過管道將整個錯誤消息寫回父級,但是您可以只寫狀態碼或其他有意義的內容。 (但是絕對要寫一些東西 ;沒有寫任何東西必須是另一個可執行文件成功啟動的標志。)

[編輯]:如何利用此:

如果父級需要等到知道子級是否成功運行了execve() (不可靠的系統調用)之后,則應在管道上執行阻塞的read() 結果為零表示成功。 (確保已忽略SIGPIPE 。)

如果父級具有基於非阻塞IO和select() (或poll()kqueue()或…)的某種事件處理框架,則在嘗試讀取消息之前等待管道變得可讀(這將是如果孩子正確執行了execve()則為零長度)。

execvp ()從不返回,除非它甚至根本無法啟動可執行文件。 如果可執行文件可以啟動,則無論可執行文件做什么(即,不管可執行文件是否成功完成其任務),它都不會返回。

您的父進程將收到SIGCHLD信號,您可以為其安裝信號處理程序。

或者,您可以wait (2)子進程。

int child_pid = fork();
if (child_pid == 0) {
    execvp("/path/to/executable", ...);
    exit(123); /* this happens only if execvp() fails to invoke executable */
}

/* ... */

int status = 0;
int exit_pid = waitpid(-1, &status, WNOHANG);
if (exit_pid == child_pid && WIFEXITED(status)) {
    if (WEXITSTATUS(status) == 0) {
        /* child process exited fine */
    } else if (WEXITSTATUS(status) == 123)
        /* execvp() itself failed */
    } else {
        /* executed child process failed */
    }
}

在您要檢查其父級狀態的(子級)進程中緩存pid。 在父級中添加SIGCHLD的處理程序。 在子調用出口中,您選擇的某些狀態值表示execvp失敗。 現在,您可以在父母那里收到信號,有2種選擇
a)用-1的pid調用waitpid(即等待任何孩子),檢查返回值,如果該值與您緩存的pid匹配,則使用WEXITSTATUS之類的宏檢查狀態。
b)用緩存的pid調用waitpid,然后在返回時檢查退出狀態。

為了使此功能更強大,應在通過WEXITSTATUS檢查退出狀態之前調用WIFEXITED(status)。 如果孩子正常終止(即通過調用exit或_exit終止而不是由於段錯誤,未處理的信號等導致的結果),則WIFEXITED返回true。另請參見man wait(2)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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