繁体   English   中英

C ++ fork()和execv()问题

[英]C++ fork() and execv() problems

我是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的输出。

任何帮助表示赞赏。

谢谢

在调用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");
}

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

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

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

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

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

FILE *in = popen("./Satzoo", "r");
// use "in" like a normal stdio FILE to read the output of Satzoo
pclose(in);

fork()页:

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

你检查以确保它成功,但不是pid是否表明我们在孩子或父母。 因此,孩子和父母两次做同样的事情,这意味着你的程序被执行两次,结束文本永远不会被打印。 你需要检查fork()的返回值不止一次。

exec - exec()系列函数用新的过程映像替换当前过程映像。

system - 执行命令时阻止。 系统命令返回后,继续执行调用程序

使用fork需要三个返回值测试

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM