3

我是 C++ 的新手,在 Linux 上开发一个简单的程序,该程序应该调用同一目录中的另一个程序并获取被调用程序的输出,而不在控制台上显示被调用程序的输出。这是我正在处理的代码片段:

    pid_t pid;
    cout<<"General sentance:"<<endl<<sentence<<endl;
    cout<<"==============================="<<endl;
    //int i=system("./Satzoo");
    if(pid=fork()<0)
        cout<<"Process could not be created..."<<endl;
    else
    {
        cout<<pid<<endl;
        execv("./Satzoo",NULL);
    }
    cout<<"General sentance:"<<endl<<sentence<<endl;
    cout<<"==============================="<<endl;

我遇到的一个问题是我可以在控制台上打印前两行,但我不能打印最后两行。我认为当我调用 Satzoo 程序时程序停止工作。另一件事是这段代码调用了 Satzoo 程序两次,我不知道为什么?我可以在屏幕上看到两次输出。另一方面,如果我使用 system() 而不是 execv(),那么 Satzoo 只能工作一次。

我还没有弄清楚如何在我的程序中读取 Satzoo 的输出。

任何帮助表示赞赏。

谢谢

4

5 回答 5

12

在调用fork(). 因此,子进程和父进程都运行execv(),因此它们各自的进程映像被替换。

你想要更多类似的东西:

pid_t pid;
printf("before fork\n");

if((pid = fork()) < 0)
{
  printf("an error occurred while forking\n");
}
else if(pid == 0)
{
  /* this is the child */
  printf("the child's pid is: %d\n", getpid());
  execv("./Satzoo",NULL);
  printf("if this line is printed then execv failed\n");
}
else
{
  /* this is the parent */
  printf("parent continues execution\n");
}
于 2009-10-18T23:13:20.437 回答
3

fork()函数克隆当前进程并在每个进程中返回不同的值。在“父”进程中,它返回子进程的 pid。在子进程中,它返回零。所以你通常会使用这样的模型来调用它:

if (fork() > 0) {
    cout << "in parent" << endl;
} else {
    cout << "in child" << endl;
    exit(0);
}

我在上面省略了错误处理。

在您的示例中,上述两个代码路径(父和子)都属于else您调用的子句fork(),导致它们都execv("./Satzoo"). 这就是为什么您的程序运行两次,以及为什么您永远不会达到超出此范围的语句的原因。

fork()您可能有兴趣使用该popen()函数,而不是手动使用和执行所有操作(正确管理流程执行是一项相当多的工作):

FILE *in = popen("./Satzoo", "r");
// use "in" like a normal stdio FILE to read the output of Satzoo
pclose(in);
于 2009-10-18T23:12:30.140 回答
2

fork()手册页:

返回值
成功完成后,fork() 将向子进程返回 0,并将子进程的进程 ID 返回给父进程。两个进程都应继续从 fork() 函数执行。否则返回-1给父进程,不创建子进程,设置errno表示错误。

You check to make sure it succeeds, but not whether the pid indicates we're in the child or the parent. Thus, both the child and the parent do the same thing twice, which means that your program gets executed twice and the ending text is never printed. You need to check the return value of fork() more than just once.

于 2009-10-18T23:14:12.703 回答
1

exec - The exec() family of functions replaces the current process image with a new process image.

system - Blocks on execution of the command. Execution of the calling program continues after the system command returns

于 2009-10-18T23:54:34.333 回答
0

你想要用 fork 进行三个返回值测试

  1. 0:你是孩子
  2. -1:错误
  3. 其他:你是父母

您从孩子和父母那里运行了另一个程序......

于 2009-10-18T23:13:10.867 回答