0

我是使用 linux 编程的新手,我试图了解 fork() 和 exec 函数是如何工作的。为了让自己更容易,我创建了一个简单的 Dummy 可执行文件(使用 gcc -o Dummy.exe ...)并尝试调用 fork 函数,以便我可以用我创建的 Dummy.exe 可执行文件替换孩子。

我遇到的问题是,当我运行代码时,它会显示 Dummy.exe 的内容,但是,我没有看到任何过去的内容 - 意思是,我没有看到父进程结束。

当我运行我的代码 Ex1.cpp 时,我得到了输出:

    Program is Running
    --- ****** ---
    Ended

    me@mdev>

我可以让程序结束的唯一方法是按回车键 - 你会在单词 Ended 之后看到一个空白行。

这是我的 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 开发,这一切对我来说都是新的 - 感谢您的帮助。

4

1 回答 1

0
#include <iostream>

使用命名空间标准;

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 函数的作用。试试这个,让我知道它是否有效,如果您还有任何问题。

于 2012-06-29T17:30:47.633 回答