所以我试图在我写的一个简短程序中使用execvp()
中的unistd.h
。但是由于一些奇怪的原因,我似乎在调用cout
函数后失去了使用printf
甚至execvp
的能力。
例如,这有效:
pid_t pid;
int status;
if ((pid = fork()) > 0) {
waitpid(pid, &status, 0);
}
else {
execvp(argv[1], &argv[1]);
}
cout << "DONE!" << endl;
但这不起作用:
execvp(argv[1], &argv[1]);
cout << "DONE!" << endl;
而且,虽然这不是一个大问题,但我想了解它为什么会发生。当我在这里和谷歌搜索时,我找不到任何相关内容。
不确定这是否与此问题有任何关系,但我在-std=c++11
使用g++
标记。
答案 0 :(得分:4)
这不起作用
execvp(argv[1], &argv[1]);
cout << "DONE!" << endl;
因为函数execvp()
永远不会返回(如果成功)。
它用新图像替换当前进程并执行它。
另一方面有效:
if ((pid = fork()) > 0) {
waitpid(pid, &status, 0);
}
else {
execvp(argv[1], &argv[1]);
}
cout << "DONE!" << endl;
这里发生的是fork()
创建一个新进程。所以你现在在同一个地方有两个进程。
pid
设置为零(这是父进程)。它进入if statement
的第一个分支,等待孩子完成。pid
设置为无零(这是子进程)。它进入第二个分支。它执行永不返回的execvp()
。它不会返回,因为进程映像被另一个可执行文件替换。注意你应该做的是:
if ((pid = fork()) > 0) {
waitpid(pid, &status, 0);
cout << "Child Finished!" << endl;
}
else {
execvp(argv[1], &argv[1]);
// This code should never execute if everything is OK.
cout << "Child failed to start" << endl;
exit(1);
}