当进程只是 运行 命令 'true' 时,WIFEXITED(status) 会是什么?
What would WIFEXITED(status) be when a process just ran the command 'true'?
如果我运行下面的代码段
pid_t p;
int status = 0;
p = fork();
if (p < 0)
report_error();
if (p == 0) // child
{
execlp("true", "true", 0);
_exit(127); // we should not get here
}
else
{
waitpid(p, &status, 0);
if(WIFEXITED(status))
printf("Exited with code %d", WEXITSTATUS(status));
}
我没有打印任何内容,因为 WIFEXITED 的计算结果似乎为假。我怀疑这是因为 "true" 本身不是命令而且 "exit" 不是子进程吗?
即使没有WEXITSTATUS(status)
,我还能依赖"exit?"吗?如果我execlp("false", "false", 0);
,是否可以保证WEXITSTATUS(status)
是1?到目前为止这似乎是真的,但我想确认这不仅仅是巧合。
这个(稍作清理):
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int
main (int argc, char **argv)
{
pid_t p;
int status = 0;
p = fork ();
if (p < 0)
{
perror ("fork failed");
}
else if (p == 0) // child
{
execlp ("true", "true", NULL);
_exit (127); // we should not get here
}
else
{
waitpid (p, &status, 0);
if (WIFEXITED (status))
printf ("Exited with code %d\n", WEXITSTATUS (status));
}
}
打印
Exited with code 0
如果我将 true
的两个实例都更改为 false
,它会打印
Exited with code 1
我怀疑问题出在您未显示的代码中(例如任何 main
),或者因为您的系统出于某种原因没有 /bin/true
:
$ ls -la /bin/true
-rwxr-xr-x 1 root root 27168 Mar 24 2014 /bin/true
(为什么 return 退出代码 0 需要 27168 个字节我不知道)
我也在 OS-X 10.9.5 上的 Mac 上测试了这个:
nimrod:~ amb$ cc --version
Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin13.4.0
Thread model: posix
nimrod:~ amb$ uname -a
Darwin nimrod.local 13.4.0 Darwin Kernel Version 13.4.0: Sun Aug 17 19:50:11 PDT 2014; root:xnu-2422.115.4~1/RELEASE_X86_64 x86_64
nimrod:~ amb$ which true
/usr/bin/true
nimrod:~ amb$ ls -la /usr/bin/true
-rwxr-xr-x 1 root wheel 13808 18 Feb 2014 /usr/bin/true
如果我运行下面的代码段
pid_t p;
int status = 0;
p = fork();
if (p < 0)
report_error();
if (p == 0) // child
{
execlp("true", "true", 0);
_exit(127); // we should not get here
}
else
{
waitpid(p, &status, 0);
if(WIFEXITED(status))
printf("Exited with code %d", WEXITSTATUS(status));
}
我没有打印任何内容,因为 WIFEXITED 的计算结果似乎为假。我怀疑这是因为 "true" 本身不是命令而且 "exit" 不是子进程吗?
即使没有WEXITSTATUS(status)
,我还能依赖"exit?"吗?如果我execlp("false", "false", 0);
,是否可以保证WEXITSTATUS(status)
是1?到目前为止这似乎是真的,但我想确认这不仅仅是巧合。
这个(稍作清理):
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int
main (int argc, char **argv)
{
pid_t p;
int status = 0;
p = fork ();
if (p < 0)
{
perror ("fork failed");
}
else if (p == 0) // child
{
execlp ("true", "true", NULL);
_exit (127); // we should not get here
}
else
{
waitpid (p, &status, 0);
if (WIFEXITED (status))
printf ("Exited with code %d\n", WEXITSTATUS (status));
}
}
打印
Exited with code 0
如果我将 true
的两个实例都更改为 false
,它会打印
Exited with code 1
我怀疑问题出在您未显示的代码中(例如任何 main
),或者因为您的系统出于某种原因没有 /bin/true
:
$ ls -la /bin/true
-rwxr-xr-x 1 root root 27168 Mar 24 2014 /bin/true
(为什么 return 退出代码 0 需要 27168 个字节我不知道)
我也在 OS-X 10.9.5 上的 Mac 上测试了这个:
nimrod:~ amb$ cc --version
Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin13.4.0
Thread model: posix
nimrod:~ amb$ uname -a
Darwin nimrod.local 13.4.0 Darwin Kernel Version 13.4.0: Sun Aug 17 19:50:11 PDT 2014; root:xnu-2422.115.4~1/RELEASE_X86_64 x86_64
nimrod:~ amb$ which true
/usr/bin/true
nimrod:~ amb$ ls -la /usr/bin/true
-rwxr-xr-x 1 root wheel 13808 18 Feb 2014 /usr/bin/true