3

Linuxシェルから実行している子プロセスをフォークするCプログラムがあります。

私の問題は、フォークした後、親プロセスがシェルのバックグラウンドに移動することです。親プロセスがフォアグラウンドに留まることを望みます。

簡単な例を次に示します。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void)
{
    int i;
    for (i = 0; i < 3; i++) {
        printf("Before Fork\n");
        sleep(1);
    }

    printf("forking...\n");
    pid_t pid = fork();
    if (pid) {
        // child
        printf("Child started and now exiting\n");
        exit(EXIT_SUCCESS);
    }

    // parent
    wait(NULL);
    for (i = 0; i < 3; i++) {
        printf("After Fork\n");
        sleep(1);
    }

    return 0;
}

出力(後でコメントを追加)

Before Fork
Before Fork
Before Fork
forking...
Child started and now exiting
After Fork
gregp@gregp-ubuntu:~/fork_example$ After Fork       # <--- User returned to shell
After Fork

fork の直後に、ユーザーがシェル プロンプトに戻り、プログラムがバックグラウンドで実行され続けることに注意してください。私はこれが起こることを望んでいません。プログラムをフォアグラウンドで実行し続けたい。

望ましい出力(後でコメントを追加)

Before Fork
Before Fork
Before Fork
forking...
Child started and now exiting
After Fork
After Fork
After Fork
                 # Program now exits and user returns to shell
gregp@gregp-ubuntu:~/fork_example$
4

3 に答える 3

3

th pid は親で返されるため、条件は次のようになります

if (!pid)

コード内の子はifに移動しないためです。それはだから

成功すると、子プロセスの PID が親に返され、0 が子に返されます。失敗すると、親に -1 が返され、子プロセスは作成されず、errno が適切に設定されます。

于 2013-08-22T19:58:19.617 に答える