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?
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.
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).
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.
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!