2012-03-08 14 views
11

Aquí está mi código (creada sólo para tenedor de prueba()):¿Por qué mi compilador no acepta fork(), a pesar de mi inclusión de <unistd.h>?

#include <stdio.h> 
#include <ctype.h> 
#include <limits.h> 
#include <string.h> 
#include <stdlib.h> 
#include <unistd.h> 

int main() 
{ 
    int pid;  
    pid=fork(); 

    if (pid==0) { 
     printf("I am the child\n"); 
     printf("my pid=%d\n", getpid()); 
    } 

    return 0; 
} 

consigo siguientes advertencias:

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

¿Cuál es el problema?

+1

¿Tiene instalados los encabezados de su biblioteca C? ¿Cómo está invocando su compilador? –

+4

gcc test.c -pedantic -Wall -o test.exe – Suspended

+0

¿estás seguro de que fork() es parte de stdio.h? no está de acuerdo con http://www.cplusplus.com/reference/clibrary/cstdio/. tal vez hay un conflicto con otro archivo de encabezado que está incluyendo? – moesef

Respuesta

28

unistd.h y fork son parte del POSIX standard. No están disponibles en Windows (text.exe en las indicaciones del comando gcc, es decir, no estás en * nix).

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

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

+2

El OP tiene '' disponible; de lo contrario, gcc habría informado un error fatal para el archivo de encabezado faltante. –

+2

MinGW no implementa fork(), quizás podría probar Cygwin (o un sistema POSIX real) si realmente necesita fork(). O bien, podría intentar una función de Windows similar. –

+4

Aunque Cygwin implementa 'fork()', [no es bonita] (http://cygwin.com/cygwin-ug-net/highlights.html#ov-hi-process). –

3

Tiene #include <unistd.h> que es donde se declara fork().

Por lo tanto, es probable que necesite para indicar al sistema para mostrar las definiciones POSIX antes de incluir las cabeceras de sistema:

#define _XOPEN_SOURCE 600 

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

Si está compilando 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 se puede jugar con _POSIX_C_SOURCE, pero utilizando _XOPEN_SOURCE implica la correcta correspondiente _POSIX_C_SOURCE (y _POSIX_SOURCE, y así sucesivamente).

+1

con gcc y glibc, la macro de prueba de características [no es realmente requerida] (http: // linux .die.net/man/2/fork) para 'fork'. Incluir [unistd.h] (http://linux.die.net/include/unistd.h) es suficiente. El estándar sí indica que las aplicaciones deberían definir '_POSIX_C_SOURCE' antes de incluir encabezados. – strcat

2

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

#include <unistd.h> 

int main(int argc, char* argv[]) 
{ 
    pid_t procID; 

    procID = fork(); 
    return procID; 
} 

... versiones sin advertencias en 11.10.

Hablando de eso, ¿qué distribución de UNIX/Linux está utilizando? Por ejemplo, he encontrado varias funciones no notables que deberían definirse en los encabezados de Ubuntu 11.10 no. Tales 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.

+3

'fork' está disponible en mucho más que los sistemas" GNU/Linux "- está disponible en cualquier lugar donde se soporte POSIX, que incluye GNU/Hurd, Unix, BSD, etc. (Y para el registro, creo que el OP está en Windows dados sus comentarios) –

+1

(Ah, se olvidó de Solaris y MacOSX, también está disponible allí) –

+1

En realidad, dije "UNIX/Linux", pero sí, fork() es una característica POSIX. El hecho de que su sistema operativo anfitrión proporcione unistd.h, no significa que sea compatible con las características POSIX (que en realidad es el punto principal de unistd.h [link] (http://en.wikipedia.org/wiki/Unistd.h)). Ese enlace proporciona una pista. Tal vez el OP necesite instalar Cygwin para proporcionar algún puente POSIX/Windows. O simplemente usa un sistema operativo host diferente. –

0

creo que usted tiene que hacer lo siguiente en su lugar:

pid_t pid = fork(); 

Para obtener más información sobre la API de Linux, vaya a this online manual page, o incluso entrar en su terminal en este momento y el tipo,

man fork 

¡Buena suerte!

Cuestiones relacionadas