我刚接触使用linux编程,我试图理解fork()和exec函数是如何工作的。为了让自己更容易,我创建了一个简单的Dummy可执行文件(使用gcc -o Dummy.exe ...)并尝试调用fork函数,这样我就可以用我创建的Dummy.exe可执行文件替换子文件。
我遇到的问题是,当我运行代码时,它会向我显示Dummy.exe的内容,但是,我没有看到任何过去的内容 - 这意味着,我没有看到父进程结束。
当我运行我的代码Ex1.cpp时,我得到输出:
Program is Running
--- ****** ---
Ended
me@mdev>
我能让程序结束的唯一方法是按回车键 - 在结束字后你会看到一个空白行。
这是我的Ex1.cpp中的代码
#include <iostream>
using namespace std;
int main()
{
pid_t retVal;
int newStatus;
switch(retVal = fork())
{
case -1:
cout<<"Error occured with fork"<<endl;
break;
case 0:
cout<<"Child forked"<<endl;
newStatus = execl("Dummy.exe","Dummy.exe", NULL);
break;
default:
cout<<"Parent has a new child: "<<retVal<<endl;
}
cout<<"Ended ..."<<endl;
return 0;
}
我的Dummy.cpp代码如下:
#include <iostream>
using namespace std;
int main()
{
cout<<"Program is Running"<<endl;
cout<<"--- ****** ---"<<endl;
cout<<"Ended"<<endl;
return 0;
}
我的背景是Windows开发,所有这些对我来说都是新的 - 感谢您的帮助。
答案 0 :(得分:0)
#include <iostream>
使用namespace std;
int main() { pid_t retVal;
int newStatus;
int returnStatus;
if (retVal = fork() < 0)
{
cout << "Error on fork" << endl;
exit (1);
}
// Child process
else if (retVal == 0)
{
// No code is executed after an exec statement
newStatus = execl("./Dummy", "Dummy", NULL);
}
else
{
// This waits for the child to finish and clean up
waitpid(retVal, &returnStatus, NULL);
}
return returnStatus;
}
在您的情况下使用switch语句不是一个好主意,因为在exec语句之后没有执行代码。您可以通过键入man 2 exec在命令提示符下阅读手册页来进一步阅读。另外,等待子进程成功退出总是一个好主意,这就是waitpid函数所做的事情。试试这个,让我知道它是否有效,如果你有任何问题。