2

所以我今天一直在做这个,我很确定我已经接近了,但我仍然对如何终止子进程以及我是否正确地完成了这个任务感到有点困惑。以下是问题描述:

Write a UNIX program that creates a child process that 
prints a greeting, sleeps for 20 seconds, then exits.
The parent process should print a greeting before creating 
the child, and another after the child has terminated. It 
should then terminate.

这是我拥有的代码:

#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>


int main()
{
    int child;

    printf("Parent Greeting\n");
    child = fork();
    if(child >= 0)
    {
        if(child == 0)
        {
            printf("Child process\n");
            sleep(2);
            printf("Child exiting\n");
            exit(0);
        }
    }
    else
    {
        printf("Failed\n");
    }
    printf("End");
    exit(1);
    return 0;
}

我遇到的问题是如何正确终止子进程。如果我将退出语句注释掉,那么子进程将运行、等待,然后将打印“结束”语句。如果我有退出语句,那么子进程会说它正在退出并且程序将一直等待直到我 ctrl+c 退出它。任何帮助将不胜感激,因为我对该主题感兴趣但有点困惑:) 谢谢!

4

3 回答 3

7

您不必从父进程中终止子进程;它应该自行终止(并且在sleep(),printf()和之后exit())。父进程应该wait()waitpid()"End"让子进程在打印消息之前死亡。此外,您的"End\n"消息应包含换行符。

exit(1);在第一个程序结束时)不需要;它表示失败。该exit()函数不返回,所以写成return是多余的。但最好删除exit()并留下return 0;指示成功。

(请注意,孩子应该包括对 的调用exit(),其值可能为 0 而不是修改后的代码中的 1。毕竟,它已经成功地完成了它的工作。)

于 2012-09-09T03:58:24.423 回答
1

问题是您已经强制父进程在子进程之前退出,在这种情况下,子进程不再成为僵尸进程,并且在某些时候成为幽灵进程,在最终退出之前的末尾添加一个 wait() 。

于 2012-09-09T04:28:36.387 回答
0

我认为这正是您想要实现的目标。

#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>

void err_sys(const char* x)
{
    perror(x);
    exit(1);
}


int main()
{
        pid_t childPid;
        printf("Parent greeting\n");
        childPid =fork();
        if (childPid  >=0)
        {
                if(childPid == 0)
                {
                        printf("Child process\n");
                        sleep(20);
                        printf("child exiting\n");
                   }
                else
                {
                     waitpid(-1,NULL,0);
                }

        }
        else
            {
                     err_sys("fork error\n");
            }
        printf("END\n");
        return 0;
}
于 2015-02-13T12:04:54.350 回答