exit(int)给出错误的值

我有一个多进程程序,它运行 4 个应该返回退出值的进程。
但是当进程到达 exit(int) 行时,它实际上将其他值返回给 wait()
例如:exit(1) 将为 wait() 提供值 256
exit(3) - 768
exit(4) - 1024
等等。我猜它会返回一个乘以 256 的 exit(int) 值。
为什么会发生这种情况以及如何解决(?)这个问题?

回答

您不能直接使用 提供的值,wait因为它以实现定义的方式对附加信息进行编码。WEXITSTATUS如果进程退出和/或其他宏,WTERMSIG或者WSTOPSIG如果涉及信号,则必须使用宏。改编自man 2 wait

int wstatus;
w = wait(&wstatus);
if (w < 0) {
    perror("wait");
    exit(EXIT_FAILURE);
}

if (WIFEXITED(wstatus)) {
    printf("exited, status=%dn", WEXITSTATUS(wstatus));
} else if (WIFSIGNALED(wstatus)) {
    printf("killed by signal %dn", WTERMSIG(wstatus));
} else if (WIFSTOPPED(wstatus)) {
    printf("stopped by signal %dn", WSTOPSIG(wstatus));
} else if (WIFCONTINUED(wstatus)) {
    printf("continuedn");
}

在我的系统(Ubuntu 到 WSL)上,WEXITSTATUS 定义为:

int wstatus;
w = wait(&wstatus);
if (w < 0) {
    perror("wait");
    exit(EXIT_FAILURE);
}

if (WIFEXITED(wstatus)) {
    printf("exited, status=%dn", WEXITSTATUS(wstatus));
} else if (WIFSIGNALED(wstatus)) {
    printf("killed by signal %dn", WTERMSIG(wstatus));
} else if (WIFSTOPPED(wstatus)) {
    printf("stopped by signal %dn", WSTOPSIG(wstatus));
} else if (WIFCONTINUED(wstatus)) {
    printf("continuedn");
}

这与您观察到的相符,其中获得的值是预期退出代码的 256 倍。但是,因为编码是由实现定义的,所以您不应该自己做出这个假设。


以上是exit(int)给出错误的值的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>