execl 不是 运行 编程

execl not running programming

我有以下两个简单的程序:

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 时堆栈上发生的内容。正如所写,程序的行为是未定义的。

P.S。始终检查库例程的 return 值是否有错误。

exec 函数族,成功时不return。 这就是执行 execl() 时看不到睡眠注释的原因。