Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Difference between wait in stdlib.h and sys/wait

Tags:

c

unix

posix

wait

I'm pretty sure there's such question, but I can't find it :\ Anyway, here's the issue:

What is the difference between wait in stdlib.h and sys/wait.h o.O ?


In details - I just encountered this problem and I could't compile a simple C program. I isolated the problem and here's what I got:

#include <stdlib.h>
//#include <sys/wait.h>

int main()
{
    int status;
    wait( &status );

    return 0;
}

If stdlib.h is included, I got:

$ gcc asd.cpp 
asd.cpp: In function ‘int main()’:
asd.cpp:9:16: error: conflicting declaration ‘wait& status’
asd.cpp:8:6: error: ‘status’ has a previous declaration as ‘int status’

What declaration ? O.o What is wait here, that conflicts with int status?

I found a thread in the net, where replacing stdlib.h with sys/wait.h solves the problem, but why is that and what is the difference?


EDIT: Thanks to sidyll's comment, I changed the file extention - from .cpp to .c and it worked! I'm shocked :) How is this so different? And still the same question - what is the different between those two wait-s ?

like image 315
Kiril Kirov Avatar asked Oct 30 '25 04:10

Kiril Kirov


2 Answers

The difference is that the wait() in <sys/wait.h> is the one you should use.

From the wait(3) man page:

SYNOPSIS
       #include <sys/types.h>
       #include <sys/wait.h>

       pid_t wait(int *status);

The wait function isn't defined by the ISO C standard, so a conforming C implementation isn't allowed to declare it in <stdlib.h> (because it's legal for a program to use the name wait for its own purposes). gcc with glibc apparently does so in its default non-conforming mode, but if you invoke it with gcc -ansi -pedantic or gcc -std=c99 -pedantic, it doesn't recognize the function name wait or the type pid_t.

like image 85
Keith Thompson Avatar answered Nov 01 '25 18:11

Keith Thompson


I did gcc -E wait.cpp to dump the actual preprocessor expansions that take place. What I found was that on linux, the header /usr/include/bits/waitstatus.h is included which pulls in a union wait { ... } but the function wait() from sys/wait.h is never pulled in. The same thing happens with the c compilation, but the for whatever reason the compiler does not complain in that case.

To prove this to yourself, you can change your main to declare the wait as a variable rather than a function call, and the compiler will not complain:

int main() {
    int status;
    wait w;
    return 0;
}
like image 28
Kevin Avatar answered Nov 01 '25 18:11

Kevin



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!