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