Why does wait() set status to 256 instead of the -

2019-01-26 07:44发布

I'm trying to return an integer value from a child process.

However, if I use exit(1) i get 256 as the output. exit(-1) gives 65280.

Is there a way I can get the actual int value that I send from the child process?

if(!(pid=fork()))
{
    exit(1);
}
waitpid(pid,&status,0);
printf("%d",status);

Edit: Using exit(-1) (which is what I actually want) I am getting 255 as the output for WEXITSTATUS(status). Is it supposed to be unsigned?

5条回答
走好不送
2楼-- · 2019-01-26 08:05

The exit code is a 16-bit value.

The high-order 8 bits are the exit code from exit().

The low-order 8 bits are zero if the process exited normally, or encode the signal number that killed the process, and whether it dumped core or not (and if it was signalled, the high-order bits are zero).

Check out the <sys/wait.h> header and the documentation for the waitpid() system call to see how to get the correct values with WIFEXITED and WEXITSTATUS.

查看更多
等我变得足够好
3楼-- · 2019-01-26 08:16

Use WEXITSTATUS() to read the correct exit status of child

Pass the status returned by waitpid() or wait()

e.g.:

int cstatus;
wait(&cstatus);
printf("Child exit status : %d\n", WEXITSTATUS(cstatus));
查看更多
你好瞎i
4楼-- · 2019-01-26 08:18

Have you tried "man waitpid"?

The value returned from the waitpid() call is an encoding of the exit value. There are a set of macros that will provide the original exit value. Or you can try right shifting the value by 8 bits, if you don't care about portability.

The portable version of your code would be:

if(!(pid=fork()))
{
    exit(1);
}
waitpid(pid,&status,0);
if (WIFEXITED(status)) {
    printf("%d", WEXITSTATUS(status));
}
查看更多
相关推荐>>
5楼-- · 2019-01-26 08:19

See the documentation. First use WIFEXITED to determine whether it terminated normally (possibly with non-zero status). Then, use WEXITSTATUS to determine what the low-order 8 bits of the actual status are.

查看更多
家丑人穷心不美
6楼-- · 2019-01-26 08:20

It doesn't. It sets it to 255. There are only 8 bits available. See the documentation.

查看更多
登录 后发表回答