C 我使用了wait(&;status),status的值是256,为什么?

C 我使用了wait(&;status),status的值是256,为什么?,c,wait,C,Wait,我的代码中有这一行: t = wait(&status); 当子进程工作时,status的值为0 但为什么它不工作时返回256?为什么在发生错误时,在子进程中更改给定给exit的参数的值不会改变任何东西(例如,exit(2)而不是exit(1)) 多谢各位 编辑:我在linux上,用GCC编译 我是这样定义身份的 int status; t = wait(&status); 给定这样的代码 int main(int argc, char **argv) { pid

我的代码中有这一行:

t = wait(&status); 
当子进程工作时,status的值为0

但为什么它不工作时返回256?为什么在发生错误时,在子进程中更改给定给exit的参数的值不会改变任何东西(例如,exit(2)而不是exit(1))

多谢各位

编辑:我在linux上,用GCC编译

我是这样定义身份的

int status;
t = wait(&status); 

给定这样的代码

int main(int argc, char **argv) {
    pid_t pid;
    int res;

    pid = fork();
    if (pid == 0) {
        printf("child\n");
        exit(1);
    }

    pid = wait(&res);
    printf("raw res=%d\n", res);

    return 0;
}
res
的值将为
256
。这是因为
wait
的返回值编码了进程的退出状态以及进程退出的原因。通常,您不应该试图直接解释
wait
中的非零返回值;您应该使用
WIF…
宏。例如,要查看进程是否正常退出,请执行以下操作:

 WIFEXITED(status)
         True if the process terminated normally by a call to _exit(2) or
         exit(3).
然后获取退出状态:

 WEXITSTATUS(status)
         If WIFEXITED(status) is true, evaluates to the low-order 8 bits
         of the argument passed to _exit(2) or exit(3) by the child.
例如:

int main(int argc, char **argv) {
    pid_t pid;
    int res;

    pid = fork();
    if (pid == 0) {
        printf("child\n");
        exit(1);
    }

    pid = wait(&res);
    printf("raw res=%d\n", res);

    if (WIFEXITED(res))
        printf("exit status = %d\n", WEXITSTATUS(res));
    return 0;
}

您可以在
等待(2)
手册页中阅读更多详细信息。

建议:尝试下列“进程完成状态”宏之一:

例如:

  int status = 0;
  ..
  int retval = wait (&status);
  if (WIFEXITED(status)) 
    printf("OK: Child exited with exit status %d.\n", WEXITSTATUS(status));
  else
    printf("ERROR: Child has not terminated correctly.\n");

状态代码包含有关子进程如何退出的各种信息。提供宏以从状态代码获取信息

从linux上的
wait(2)

If status is not NULL, wait() and waitpid() store status information in the int to which it points.  This integer can be inspected with the following macros (which take the integer itself as an argu-
   ment, not a pointer to it, as is done in wait() and waitpid()!):

   WIFEXITED(status)
          returns true if the child terminated normally, that is, by calling exit(3) or _exit(2), or by returning from main().

   WEXITSTATUS(status)
          returns  the  exit status of the child.  This consists of the least significant 8 bits of the status argument that the child specified in a call to exit(3) or _exit(2) or as the argument for a
          return statement in main().  This macro should be employed only if WIFEXITED returned true.

   WIFSIGNALED(status)
          returns true if the child process was terminated by a signal.

   WTERMSIG(status)
          returns the number of the signal that caused the child process to terminate.  This macro should be employed only if WIFSIGNALED returned true.

   WCOREDUMP(status)
          returns true if the child produced a core dump.  This macro should be employed only if WIFSIGNALED returned true.  This macro is not specified in POSIX.1-2001 and is not available on some UNIX
          implementations (e.g., AIX, SunOS).  Only use this enclosed in #ifdef WCOREDUMP ... #endif.

   WIFSTOPPED(status)
          returns true if the child process was stopped by delivery of a signal; this is possible only if the call was done using WUNTRACED or when the child is being traced (see ptrace(2)).

   WSTOPSIG(status)
          returns the number of the signal which caused the child to stop.  This macro should be employed only if WIFSTOPPED returned true.

   WIFCONTINUED(status)
          (since Linux 2.6.10) returns true if the child process was resumed by delivery of SIGCONT.

问:什么平台?窗户?Linux?问:什么编译器?无国界医生?GCC?问:你是如何定义“地位”的<代码>内部状态?请显示一个最小的示例。您错了<代码>退出(2)将返回
512
,而不是
256
(假设为linux或类似系统)。退出值在第二个最低字节中编码,而最低字节编码有关进程终止原因的信息(例如信号号)。这就是我指定它的原因。。。它总是返回256。您的示例中是否打算使用
wait
?使用
系统
有点模糊了这与
等待
有什么关系。啊,我完全发呆了。让我来解决这个问题。请注意,这个示例实际上工作正常,因为由
system()
调用发出的
fork()
返回状态是保持的,但您是对的,这在技术上是有问题的。