#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;
}