Ven*_*tta 17 c++ linux parallel-processing process exec
我正在尝试生成一个执行系统命令的进程,而我自己的程序仍在进行,两个进程将并行运行.我正在研究linux.
我在网上查了一下,听起来我应该使用exec()系列.但它并不像我预期的那样有效.例如,在下面的代码中,我只看到"之前"打印,但不是"完成".
如果我发布任何东西,我很好奇吗?
#include <unistd.h>
#include <iostream>
using namespace std;
main()
{
cout << "before" << endl;
execl("/bin/ls", "/bin/ls", "-r", "-t", "-l", (char *) 0);
cout << "done" << endl;
}
Run Code Online (Sandbox Code Playgroud)
[UPDATE]
谢谢你们的评论.现在我的程序看起来像这样.一切正常,除了最后,我必须按回车完成程序.我不知道为什么我要按最后一次输入?
#include <unistd.h>
#include <iostream>
using namespace std;
main()
{
cout << "before" << endl;
int pid = fork();
cout << pid << endl;
if (pid==0) {
execl("/bin/ls", "ls", "-r", "-t", "-l", (char *) 0);
}
cout << "done" << endl;
}
Run Code Online (Sandbox Code Playgroud)
Rob*_*edy 18
你错过了一个电话fork.一切exec都是用新程序替换当前的过程映像.使用fork产卵您的当前进程的副本.它的返回值将告诉您它是孩子还是正在运行的原始父母.如果是孩子,请致电exec.
一旦你做出改变,它只是看起来,你需要按输入完成计划.实际发生的是:父进程分叉并执行子进程.两个进程都运行,并且两个进程同时打印到stdout.他们的输出是乱码.父进程比子进程少,所以它首先终止.当它终止时,正在等待它的shell唤醒并打印通常的提示.同时,子进程仍在运行.它会打印更多文件条目.最后,它终止了.shell没有注意子进程(它的孙子),所以shell没有理由重新打印提示.仔细查看你得到的输出,你应该能够找到埋在ls上面输出中的常用命令提示符.
光标似乎在等待您按一个键.当你这样做时,shell会打印一个提示,所有看起来都很正常.但就外壳而言,一切都已经正常了.您之前可以输入另一个命令.它看起来有点奇怪,但shell会正常执行它,因为它只接收来自键盘的输入,而不是来自子进程将其他字符打印到屏幕上.
如果您使用类似于top单独控制台窗口中的程序,则可以在必须按Enter键之前观察并确认两个程序都已完成运行.
该Exec系列函数替换为新的执行当前进程.
要执行您需要的操作,请使用其中一个fork()功能并让子进程处理exec新图像.
[回复更新]
这正是你所说的:你不必按"输入"完成程序:它已经退出了.shell已经提示:
[wally@zenetfedora ~]$ ./z
before
22397
done
[wally@zenetfedora ~]$ 0 << here is the prompt (as well as the pid)
total 5102364
drwxr-xr-x. 2 wally wally 4096 2011-01-31 16:22 Templates
...
Run Code Online (Sandbox Code Playgroud)
输出ls需要一段时间,因此它会掩盖提示.如果您希望输出以更合理的顺序出现,请sleep(1)在"完成"之前添加(或者更长).
| 归档时间: |
|
| 查看次数: |
47803 次 |
| 最近记录: |