题
我是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);
}
我省略了上述错误处理。
在您的示例中,以上两个代码路径(父母和子女)都属于 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);
来自 fork()
manpage:
返回值
成功完成后,fork()应将0返回儿童流程,并应将子程序的流程ID归还给父程流程。这两个过程均应继续从叉()函数执行。否则,-1应将其返回到父进程,不得创建子过程,并且应设置ERRNO表示错误。
您检查以确保它成功,但不是 pid
表示我们在孩子或父母中。因此,孩子和父母都做同样的事情两次,这意味着您的程序被执行两次,而结尾文本永远不会打印。您需要检查返回值 fork()
不止一次。
exec -exec()函数族用新的进程图像替换了当前的进程图像。
系统 - 执行命令。在系统命令返回后,呼叫程序的执行继续
叉子有三个回报值测试
- 0:你是孩子
- -1:错误
- 其他:你是父母
您从孩子和父母那里运行了另一个程序...