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

5 minutos de lectura

avatar de usuario
Suspendido

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

#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;
}

Recibo las siguientes advertencias:

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

¿Qué tiene de malo?

  • ¿Tiene instalados los encabezados de su biblioteca C? ¿Cómo estás invocando a tu compilador?

    – Ley de karité

    8 de marzo de 2012 a las 2:59

  • gcc test.c -pedantic -Wall -o test.exe

    – Suspendido

    8 de marzo de 2012 a las 3:01


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

    – moesef

    8 de marzo de 2012 a las 3:02


  • Aparentemente es parte de ¿Cómo puede estar en conflicto con lo que incluí?

    – Suspendido

    8 de marzo de 2012 a las 3:09

  • @user1166935: ¿Qué sistema operativo estás usando? ¿Es posible que tengas un mal unistd.h archivo por alguna razón?

    –Keith Thompson

    8 de marzo de 2012 a las 3:34

avatar de usuario
strcat

unistd.h y fork son parte de la estándar POSIX. No están disponibles en Windows (text.exe en su comando gcc indica que no está en * nix).

Parece que estás usando gcc como parte de MinGWque proporciona la unistd.h encabezado pero no implementa funciones como fork. Cygwin lo hace proporcionar implementaciones de funciones como fork.

Sin embargo, dado que se trata de una tarea, ya debería tener instrucciones sobre cómo obtener un entorno de trabajo.

  • El OP tiene <unistd.h> disponible; de lo contrario, gcc habría informado un error fatal para el archivo de encabezado faltante.

    –Keith Thompson

    8 de marzo de 2012 a las 3:33

  • MinGW no implementa fork(), tal vez podría probar Cygwin (o un sistema POSIX real) si realmente necesita fork(). O bien, podría probar una función de Windows similar.

    –Sam Watkins

    8 de marzo de 2012 a las 3:38


  • Aunque Cygwin implementa fork(), no es bonito.

    – Adam Rosenfield

    8 de marzo de 2012 a las 4:14

  • ver también code.google.com/p/chromium/wiki/CygwinDllRemappingFailure re cygwin fork()

    – Cristóbal

    8 de marzo de 2012 a las 9:11

  • “ya debería tener instrucciones sobre cómo obtener un entorno de trabajo” -si las universidades fueran tan buenas.

    – Ryan

    8 de octubre de 2019 a las 4:30

avatar de usuario
jonathan leffler

Usted tiene #include <unistd.h> cuál es dónde fork() se declara.

Entonces, 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 mayormente compatible con POSIX 2008, o incluso 500 para un sistema más antiguo. Porque fork() ha existido desde siempre, aparecerá con cualquiera de esos.

Si está compilando con -std=c99 --pedantictodas las declaraciones para POSIX se ocultarán a menos que las solicite explícitamente como se muestra.

También puedes jugar con _POSIX_C_SOURCEpero usando _XOPEN_SOURCE implica la correcta correspondiente _POSIX_C_SOURCE (y _POSIX_SOURCEy así).

  • con gcc y glibc, la macro de prueba de características en realidad no es necesario por fork. Incluso unistd.h es suficiente. El estándar establece que las aplicaciones deben definir _POSIX_C_SOURCE antes de incluir encabezados sin embargo.

    – strcat

    8 de marzo de 2012 a las 3:21


Como ya notó, fork() debe 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;
}

…compila sin advertencias el 11.10.

Hablando de eso, ¿qué distribución de UNIX/Linux estás usando? Por ejemplo, he encontrado varias funciones no destacables que deberían definirse en los encabezados de Ubuntu 11.10 y no lo están. Tal 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 del encabezado estándar a quien mantenga la distribución de su sistema operativo.

  • fork está disponible en muchos más sistemas además de “GNU/Linux”: está disponible en cualquier lugar que sea compatible con POSIX, lo que incluye GNU/Hurd, Unix, BSD, etc. (Y para que conste, creo que el OP está en Windows dados sus comentarios)

    – Billy ONeal

    8 de marzo de 2012 a las 3:21


  • (Oh, olvidé Solaris y MacOSX, también está disponible allí)

    – Billy ONeal

    8 de marzo de 2012 a las 3:29

  • En realidad, dije “UNIX/Linux”, pero sí, fork() es una característica de POSIX. El hecho de que su sistema operativo host proporcione unistd.h no significa que sea compatible con las funciones POSIX (que en realidad es el punto principal de unistd.h Enlace). Ese enlace da una pista. Tal vez el OP necesite instalar Cygwin para proporcionar algún puente POSIX/Windows. O simplemente use un sistema operativo host diferente.

    –Craig Mc

    8 de marzo de 2012 a las 5:10


Creo que tienes que 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 del manual en líneao incluso acceda a su terminal ahora mismo y escriba,

man fork

¡Buena suerte!

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad