使用fork()和execl(...)时父进程没有结束

时间:2012-06-29 17:09:59

标签: fork

我刚接触使用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开发,所有这些对我来说都是新的 - 感谢您的帮助。

1 个答案:

答案 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函数所做的事情。试试这个,让我知道它是否有效,如果你有任何问题。