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

pieyvz9o  于 2022-12-11  发布在  其他
关注(0)|答案(3)|浏览(251)

我有这样的代码:

int status;
t = wait(&status);

当子进程工作时,status的值为0,井。
但是,为什么它不工作时返回256呢?为什么在出现错误时更改子进程中为exit指定的参数值并没有改变任何东西(例如,用exit(2)代替exit(1))呢?
编辑:我在linux上,我用愚者编译。

4uqofj5v

4uqofj5v1#

给定这样的代码...

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;
}

您可以在“wait(2)在线手册”中阅读更多详细信息。

jfewjypa

jfewjypa2#

状态码包含子进程如何退出的各种信息。提供了宏来从状态码中获取信息。
从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.
rslzwgfq

rslzwgfq3#

建议:尝试下列其中一个“程序完成状态”宏:
http://www.gnu.org/software/libc/manual/html_node/Process-Completion-Status.html
示例:

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");

相关问题