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

我是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将被返回到父进程,不会创建子进程,并且应设置错误号来指示错误。

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

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

系统 – 执行命令时阻塞。 在系统命令返回后继续执行调用程序

有三个你想要的分叉返回值测试

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

您从孩子和父母运行另一个程序…