親プロセスが子プロセスを作成し、子プロセスが完了する前に終了し、孤立プロセスを親プロセスに再初期化するにはどうすればよいですか。

親プロセスが子プロセスを作成し、子プロセスが完了する前に終了し、孤立プロセスを親プロセスに再初期化するにはどうすればよいですか。
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>

int main ()
{
  pid_t child_pid;

  child_pid = fork ();
  // parent process
  if (child_pid > 0) {
    printf("\n(parent): Parent's PID : %d\n",getpid());
    fflush(stdout);
    sleep (10);
    printf("\n(parent): Parent exits\n");
    fflush(stdout);
    /*int returnStatus;
    waitpid(child_pid, &returnStatus, 0);
    if (returnStatus == 0)  // Verify child process is terminated.
    {
       printf("The child process terminated normally.");
                         sleep(10);
    }*/
  }
  // child process
  else {
    printf("\n(child): Child's PID : %d\n",getpid());
    printf("\n(child): Child's Parent ID : %d\n",getppid());
    printf("\n(child): Child exits and becomes and zombie while parent 
sleeps.\n");
    fflush(stdout);
    exit (0);
  }
  return 0;
}

これは私がこれまでUnixでVimを使って得た結果です。親が子を作成するときに子が完了する前に終了し、子が完了すると孤児になり、再び親になり、子が終了するようにこの部分を変更するにはどうすればよいですか。

私はsleep(value)これらのプロセスを遅らせる必要があることを知っていますが、元の親が消えた後に孤児が再び両親になることができるように、私が遅れているものが何であるかはわかりません。

ベストアンサー1

sleepシステム使用量が多い場合や不必要に長い遅延が必要な場合は、正常に動作しない可能性があります。より良いアプローチは、親と子の間で通信し、親が応答するまで、またはこの場合消えるまで子がブロックされるようにすることです。これはread、親プロセス(後で...)が終了するまでブロックする子プロセスのパイプとブロックを介して実行できます。

#include <err.h>
#include <errno.h>
#include <unistd.h>

int main(void)
{
    char ch;
    int fd[2];
    pid_t pid;
    ssize_t ret;

    pipe(fd);

    pid = fork();
    if (pid < 0) {
        err(1, "fork failed");
    } else if (pid == 0) { /* child */
        close(fd[1]);
        warnx("child  %d start", getpid());
        // block until parent goes away
        ret = read(fd[0], &ch, 1);
        warnx("child  %d parent gone", getpid());
    } else { /* parent */
        // simulate system being slow
        sleep(3);
    }
    return 0;
}

おすすめ記事