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 spec,execl
的参数列表必须由 NULL 指针终止(即 (char *)0
,而不是 ""
)。
更改附近的代码只是更改调用 execl
时堆栈上发生的内容。正如所写,程序的行为是未定义的。
P.S。始终检查库例程的 return 值是否有错误。
exec 函数族,成功时不return。
这就是执行 execl() 时看不到睡眠注释的原因。
我有以下两个简单的程序:
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 spec,execl
的参数列表必须由 NULL 指针终止(即 (char *)0
,而不是 ""
)。
更改附近的代码只是更改调用 execl
时堆栈上发生的内容。正如所写,程序的行为是未定义的。
P.S。始终检查库例程的 return 值是否有错误。
exec 函数族,成功时不return。 这就是执行 execl() 时看不到睡眠注释的原因。