我有以下两个简单程序:

bye.cc

#include <iostream>

int main()
{ std::cout <<  "Bye bye bye world" << std::endl; }

hello.cc
#include <cstdlib>
#include <unistd.h>
#include <sys/wait.h>
#include <iostream>
using namespace std;


int main()
{
    int status;

    cout <<  "Hello world" << endl;

    int pid = fork();
    if (pid != 0) {
        cout << "I am parent - " << pid << endl;
        // wait for child to finish up......
        cout << "Waiting for child to finish" << endl;
        wait(&status);
        cout << "Child finished, status " << status << endl;
    } else {
        cout << "--- I am child - " << pid << endl;   // **Note**
        execl("bye", "");
        cout << "--- I am sleeping" << endl;
        sleep(3);
        exit(11);
    }
}

在hello.cc中,如果启用了标记为“Note”的行(未注释),则得到预期的行为,sleep(3)未执行,并且执行了“bye”,预期消息已打印到控制台。
$ ./hello
Hello world
I am parent - 27318
Waiting for child to finish
--- I am child - 0
Bye bye bye world
Child finished, status 0

但是,当注释标记为“Note”的行时,不会执行“bye”,并且将执行sleep(3)。
$ ./hello
Hello world
I am parent - 27350
Waiting for child to finish
--- I am sleeping
Child finished, status 2816

有人可以帮我了解可能会发生什么。我发现很奇怪,如果我用printf()替换“cout”,则执行睡眠。

谢谢,
艾哈迈德。

最佳答案

根据the specexecl的参数列表必须以NULL指针终止(即(char *)0,而不是"")。

更改附近的代码只是在更改调用execl时堆栈上的内容。如所写,程序的行为是不确定的。

附言始终检查库例程的返回值是否有错误。

关于c++ - execl未运行编程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28469803/

10-10 02:57