¿Por qué mi comstackdor no acepta fork (), a pesar de mi inclusión de ?

Aquí está mi código (creado solo para probar fork ()):

#include  #include  #include  #include  #include  #include  int main() { int pid; pid=fork(); if (pid==0) { printf("I am the child\n"); printf("my pid=%d\n", getpid()); } return 0; } 

Recibo las siguientes advertencias:

 warning: implicit declaration of function 'fork' undefined reference to 'fork' 

¿Qué tiene de malo?

unistd.h y fork son parte del estándar POSIX . No están disponibles en Windows ( text.exe en el comando gcc sugiere que no está en * nix).

Parece que está utilizando gcc como parte de MinGW , que proporciona el encabezado unistd.h pero no implementa funciones como fork . Cygwin proporciona implementaciones de funciones como fork .

Sin embargo, dado que esto es tarea, ya debe tener instrucciones sobre cómo obtener un entorno de trabajo.

Tiene #include que es donde se declara fork() .

Por lo tanto, probablemente necesite decirle al sistema que muestre las definiciones POSIX antes de incluir los encabezados del sistema:

 #define _XOPEN_SOURCE 600 

Puede usar 700 si cree que su sistema es en su mayoría compatible con POSIX 2008 o incluso 500 para un sistema anterior. Debido a que fork() ha existido por siempre, se mostrará con cualquiera de ellos.

Si está comstackndo con -std=c99 --pedantic , entonces todas las declaraciones de POSIX estarán ocultas a menos que las solicite explícitamente como se muestra.

También puede jugar con _POSIX_C_SOURCE , pero usar _XOPEN_SOURCE implica la correcta correspondiente _POSIX_C_SOURCE (y _POSIX_SOURCE , etc.).

Como ya ha notado, fork () debería definirse en unistd.h, al menos de acuerdo con las páginas man que vienen con Ubuntu 11.10. Lo mínimo:

 #include  int main( int argc, char* argv[]) { pid_t procID; procID = fork(); return procID; } 

… construye sin advertencias en 11.10.

Hablando de eso, ¿qué distribución de UNIX / Linux estás usando? Por ejemplo, he encontrado varias funciones no notables que deberían definirse en los encabezados de Ubuntu 11.10 no. Como:

 // string.h char* strtok_r( char* str, const char* delim, char** saveptr); char* strdup( const char* const qString); // stdio.h int fileno( FILE* stream); // time.h int nanosleep( const struct timespec* req, struct timespec* rem); // unistd.h int getopt( int argc, char* const argv[], const char* optstring); extern int opterr; int usleep( unsigned int usec); 

Mientras estén definidos en su biblioteca C, no será un gran problema. Simplemente defina sus propios prototipos en un encabezado de compatibilidad e informe los problemas de encabezado estándar a quien mantenga su distribución de sistema operativo.

Creo que debes hacer lo siguiente en su lugar:

 pid_t pid = fork(); 

Para obtener más información sobre la API de Linux, vaya a esta página de manual en línea , o incluso acceda a su terminal ahora y escriba,

 man fork 

¡Buena suerte!