2012-03-08 10 views
11

Ecco il mio codice (creato solo per testare fork()):Perché il mio compilatore non accetta fork(), nonostante la mia inclusione di <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; 
} 

ottengo seguenti avvertenze:

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

Cosa c'è di sbagliato con esso?

+1

Avete installato le intestazioni della libreria C? Come stai invocando il tuo compilatore? –

+4

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

+0

sei sicuro che fork() è parte di stdio.h? non è secondo http://www.cplusplus.com/reference/clibrary/cstdio/. forse c'è un conflitto con un altro file di intestazione che stai includendo? – moesef

risposta

28

unistd.h e fork fanno parte dello POSIX standard. Non sono disponibili su Windows (text.exe nel tuo comando gcc suggerisce che non sei su * nix).

Sembra che tu stia utilizzando gcc come parte di MinGW, che fornisce l'intestazione unistd.h ma non implementa funzioni come fork. Cygwinfa fornire implementazioni di funzioni come fork.

Tuttavia, poiché questo è compito a casa dovresti già avere istruzioni su come ottenere un ambiente di lavoro.

+2

L'OP ha '' disponibile; altrimenti gcc avrebbe segnalato un errore fatale per il file di intestazione mancante. –

+2

MinGW non implementa fork(), potresti forse provare Cygwin (o un vero sistema POSIX) se hai davvero bisogno di fork(). Oppure, potresti provare una funzione simile a quella di Windows. –

+4

Anche se Cygwin implementa 'fork()', [non è carina] (http://cygwin.com/cygwin-ug-net/highlights.html#ov-hi-process). –

3

Hai #include <unistd.h> che è dove viene dichiarato fork().

Quindi, probabilmente avete bisogno di dire al sistema per mostrare le definizioni POSIX prima di includere le intestazioni di sistema:

#define _XOPEN_SOURCE 600 

È possibile utilizzare 700 se pensate che il vostro sistema è in gran parte POSIX 2008 compliant, o addirittura 500 per un sistema più vecchio. Perché fork() è stato intorno per sempre, verrà visualizzato con uno di quelli.

Se si sta compilando con -std=c99 --pedantic, tutte le dichiarazioni per POSIX verranno nascoste a meno che non vengano richieste esplicitamente come mostrato.

si può anche giocare con _POSIX_C_SOURCE, ma utilizzando _XOPEN_SOURCE implica la corretta corrispondente _POSIX_C_SOURCE (e _POSIX_SOURCE, e così via).

+1

con gcc e glibc, la macro di test delle funzionalità [non è effettivamente necessaria] (http: // linux .die.net/man/2/fork) per 'fork'. Includere [unistd.h] (http://linux.die.net/include/unistd.h) è sufficiente. Lo standard afferma che le applicazioni dovrebbero definire '_POSIX_C_SOURCE' prima di includere le intestazioni. – strcat

2

Come già notato, fork() deve essere definito in unistd.h, almeno in base alle pagine man fornite con Ubuntu 11.10. Il minimo:

#include <unistd.h> 

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

    procID = fork(); 
    return procID; 
} 

... build senza avvisi in 11.10.

A proposito di quale distribuzione UNIX/Linux stai utilizzando? Per esempio, ho trovato diverse funzioni non notevoli che dovrebbero essere definite nelle intestazioni di Ubuntu 11.10 non lo sono. Come ad esempio:

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

Finché stanno definiti nella libreria C non sarà un problema enorme. È sufficiente definire i propri prototipi in un'intestazione di compatibilità e segnalare i problemi di intestazione standard a chiunque mantenga la propria distribuzione del sistema operativo.

+3

'fork' è disponibile su molto più di sistemi" GNU/Linux "- è disponibile ovunque POSIX è supportato, che include GNU/Hurd, Unix, BSD, ecc. (E per la cronaca, credo che l'OP sia su Windows dati i suoi commenti) –

+1

(Oh, ho dimenticato Solaris e MacOSX, è disponibile anche lì) –

+1

In realtà, ho detto "UNIX/Linux", ma sì, fork() è una funzionalità POSIX. Solo perché il sistema operativo host fornisce unistd.h, non significa che supporti le funzionalità POSIX (che in realtà è il punto principale di unistd.h [collegamento] (http://en.wikipedia.org/wiki/Unistd.h)). Questo link fornisce un indizio. Forse l'OP deve installare Cygwin per fornire alcuni bridge POSIX/Windows. O semplicemente utilizzare un diverso sistema operativo host. –

0

penso che bisogna fare quanto segue invece:

pid_t pid = fork(); 

Per ulteriori informazioni sulla API di Linux, andare a this online manual page, o anche andare nel vostro terminale in questo momento e tipo,

man fork 

Buona fortuna!

Problemi correlati