web-dev-qa-db-fra.com

Pourquoi mon compilateur n'accepte-t-il pas fork (), malgré l'inclusion de <unistd.h>?

Voici mon code (créé juste pour tester 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;
}

Je reçois les avertissements suivants:

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

Qu'est-ce qui va pas avec ça?

12
Suspended

unistd.h et fork font partie du standard POSIX . Ils ne sont pas disponibles sous Windows (text.exe dans vos indications de commande gcc si vous n'êtes pas sur * nix).

Il semble que vous utilisiez gcc dans MinGW , qui fournit l’en-tête unistd.h mais ne met pas en œuvre des fonctions telles que fork. Cygwinne fournit des implémentations de fonctions telles que fork.

Cependant, comme il s’agit d’un devoir, vous devriez déjà avoir des instructions sur la manière d’obtenir un environnement de travail.

32
strcat

Vous avez #include <unistd.h> qui est où fork() est déclaré.

Vous devez donc probablement indiquer au système d’afficher les définitions POSIX avant d’inclure les en-têtes système:

#define _XOPEN_SOURCE 600

Vous pouvez utiliser 700 si vous pensez que votre système est généralement conforme à POSIX 2008, ou même 500 pour un système plus ancien. Puisque fork() existe depuis toujours, il apparaîtra avec n'importe lequel de ceux-ci.

Si vous compilez avec -std=c99 --pedantic, toutes les déclarations pour POSIX seront masquées, à moins que vous ne les demandiez explicitement comme indiqué.

Vous pouvez également jouer avec _POSIX_C_SOURCE, mais utiliser _XOPEN_SOURCE implique le _POSIX_C_SOURCE correspondant (et _POSIX_SOURCE, et ainsi de suite).

4
Jonathan Leffler

Comme vous l'avez déjà noté, fork () devrait être défini dans unistd.h - du moins en fonction des pages de manuel fournies avec Ubuntu 11.10. Le minimum:

#include <unistd.h>

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

    procID = fork();
    return procID;
}

... construit sans avertissements le 11.10.

En parlant de cela, quelle distribution UNIX/Linux utilisez-vous? Par exemple, j'ai trouvé plusieurs fonctions non remarquables qui devraient être définies dans les en-têtes d'Ubuntu 11.10. Tel que:

// 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);

Tant qu'ils sont définis dans votre bibliothèque C, le problème ne sera pas énorme. Définissez simplement vos propres prototypes dans un en-tête de compatibilité et signalez les problèmes d’en-tête standard à quiconque gère la distribution de votre système d’exploitation.

2
Craig Mc

Je pense que vous devez plutôt faire ce qui suit:

pid_t pid = fork();

Pour en savoir plus sur les API Linux, allez à cette page de manuel en ligne , ou même allez dans votre terminal maintenant et tapez

man fork

Bonne chance!

0
2fewChars