execl没有运行编程

execl not running programming

本文关键字:编程 运行 execl      更新时间:2023-10-16

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

再见.cc

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

你好.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",那么睡眠就完成了。

谢谢,艾哈迈德。

根据规范,execl的参数列表必须由NULL指针终止(即(char *)0,而不是"")。

更改附近的代码只是更改调用execl时堆栈上发生的内容。正如所写的,程序的行为是未定义的。

p.S.始终检查库例程的返回值是否存在错误。

exec函数家族,如果成功,则不返回。这就是为什么在执行execl()时看不到sleep注释的原因。