为什么我必须手动终止我的程序?

时间:2014-09-20 22:26:26

标签: c++ fork terminate

我有一个应该启动另一个进程并与之同时工作的程序。我正在使用fork()system()来完成此任务。我有代码验证我的system()调用返回,但每次执行时我都必须通过键入ctrl c手动结束执行。我可以说我的一个进程终止了,但我不太清楚哪一个进程。我相信这是父母。但两者都应该被return语句捕获。

这是父进程代码(forkWaitTest):

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

using namespace std;

int main(void)
{
        pid_t childPID;
        int status;

        childPID = fork();
        if(childPID >=0)
        {
                if(childPID == 0)
                {
                        cout <<"I'm the fork child";
                        cout.flush();
                        status=system("child");
                        cout << "status = " << status;
                        //exit(0);
                        //cout << "Am I getting here?";
                }
                else{
                cout << "I am the parent and can keep doing things ";
                int y=1;
                int x=7;
                cout<< y+x << " ";
                }
        }
        return 0;
}

这是名为

的子进程
#include <stdio.h>

int main(int argc, char *argv[] )
{

  printf("I am the child\n");
  return 0;
}

这是我的输出:

-bash-4.2$ forkWaitTest
I am the parent and can keep doing things 8 I'm the fork child-bash-4.2$ I am the child
status = 0

2 个答案:

答案 0 :(得分:3)

您的父DID终止。让我们来看看你的输出:

-bash-4.2$ forkWaitTest
I am the parent and can keep doing things 8 I'm the fork child-bash-4.2$ I am the child
status = 0

现在让我们更仔细地看一下,特别是这一点:

I'm the fork child-bash-4.2$

在中间看,它说bash-4.2$。这是父进程终止后的命令提示符。然后孩子跑步并退出,但是你在bash提示后打印时感到困惑。你的^C只打印下一行。

要验证,请按几次而不是^C

答案 1 :(得分:1)

确保您的消息以换行符结尾(例如,将<< endl添加到输出中。)

我看到您的bash提示符(-bash-4.2$)与其他输出结果混淆,部分原因是您的输出中没有换行符,部分原因是您的代码未显示任何尝试等孩子死这意味着您的流程确实已经死亡。

您可以键入:ls -l并且shell将执行该命令,因为它正在等待您键入内容。当你打断它(shell)时,它会再次提示,但即使没有中断也会输入你的输入。


稍加修改版child

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

int main(void)
{
  printf("I am the walrus (%d)\n", (int)getpid());
  return 0;
}

和父母的略微修改版本:

#include <cstdlib>
#include <iostream>
#include <sys/wait.h>
#include <unistd.h>

using namespace std;

int main(void)
{
    pid_t childPID;
    int status;

    childPID = fork();
    if (childPID >= 0)
    {
        if (childPID == 0)
        {
            cout << "I'm the forked child (" << getpid() << ")\n";
            cout.flush();
            status = system("child");
            cout << "status = " << status << endl;
            cout << "Am I getting here?\n";
            return 0;
        }
        else
        {
            cout << "I am the parent and can keep doing things ";
            int y = 1;
            int x = 7;
            cout << y + x << endl;
        }
    }
    int corpse;
    while ((corpse = wait(&status)) != -1)
        cout << "PID " << corpse << " exited with status " << status << endl;
    return 0;
}

并且提示符Osiris JL:,我得到的输出示例是:

Osiris JL: ./parent
I am the parent and can keep doing things 8
I'm the forked child (3192)
I am the walrus (3193)
status = 0
Am I getting here?
PID 3192 exited with status 0
Osiris JL:

请注意,'child'程序由父进程自己子进程的子进程运行(这就是打印getpid()值的原因)。并且父进程中的循环中的wait()确保子进程在父进程死亡之前已经死亡。给定使用system()函数的子进程的结构,孙子进程(运行部分错误的child进程)已经在子进程退出之前退出。省略wait()循环,父母可以在孩子和孙子之前轻松退出:

Osiris JL: ./parent
I am the parent and can keep doing things 8
I'm the forked child (3207)
Osiris JL: I am the walrus (3208)
status = 0
Am I getting here?
ls -ld parent* child*
-rwxr-xr-x  1 jleffler  staff  8784 Sep 20 15:57 child
-rw-r--r--  1 jleffler  staff   122 Sep 20 15:57 child.cpp
drwxr-xr-x  3 jleffler  staff   102 Sep 20 15:57 child.dSYM
-rwxr-xr-x  1 jleffler  staff  9808 Sep 20 16:02 parent
-rw-r--r--  1 jleffler  staff   858 Sep 20 16:02 parent.cpp
drwxr-xr-x  3 jleffler  staff   102 Sep 20 16:02 parent.dSYM
Osiris JL: