it-swarm.com.de

Warum akzeptiert mein Compiler kein fork (), obwohl ich <unistd.h> angegeben habe?

Hier ist mein Code (nur zum Testen von fork () erstellt):

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

Ich erhalte folgende Warnungen:

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

Was ist daran falsch?

12
Suspended

unistd.h und fork sind Bestandteil des POSIX-Standards . Sie sind unter Windows nicht verfügbar (text.exe in Ihrem gcc-Befehl weist darauf hin, dass Sie sich nicht auf * nix befinden).

Es sieht so aus, als würden Sie gcc als Teil von MinGW verwenden, das zwar den unistd.h-Header bereitstellt, aber keine Funktionen wie fork implementiert. Cygwin do bietet Implementierungen von Funktionen wie fork.

Da dies jedoch Hausaufgaben machen, sollten Sie bereits Anweisungen haben, wie Sie eine Arbeitsumgebung erhalten.

32
strcat

Sie haben #include <unistd.h>, wo fork() deklariert ist.

Daher müssen Sie das System wahrscheinlich anweisen, die POSIX-Definitionen anzuzeigen, bevor Sie die Systemkopfzeilen einfügen:

#define _XOPEN_SOURCE 600

Sie können 700 verwenden, wenn Sie der Meinung sind, dass Ihr System größtenteils POSIX 2008-kompatibel ist, oder 500 für ein älteres System. Da fork() schon immer existiert, wird es bei jedem von ihnen auftauchen.

Wenn Sie mit -std=c99 --pedantic kompilieren, werden alle Deklarationen für POSIX ausgeblendet, sofern Sie sie nicht explizit wie gezeigt anfordern.

Sie können auch mit _POSIX_C_SOURCE spielen, die Verwendung von _XOPEN_SOURCE impliziert jedoch den korrekten _POSIX_C_SOURCE (und _POSIX_SOURCE usw.).

4

Wie Sie bereits erwähnt haben, sollte fork () in unistd.h definiert werden - zumindest gemäß den Manpages, die mit Ubuntu 11.10 geliefert werden. Das Minimum:

#include <unistd.h>

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

    procID = fork();
    return procID;
}

... baut ohne Warnungen am 11.10.

Apropos: Welche UNIX/Linux-Distribution verwenden Sie? Ich habe zum Beispiel einige nicht bemerkenswerte Funktionen gefunden, die in den Kopfzeilen von Ubuntu 11.10 nicht definiert werden sollten. Sowie:

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

Solange sie in Ihrer C-Bibliothek definiert sind, ist dies kein großes Problem. Definieren Sie einfach Ihre eigenen Prototypen in einem Kompatibilitätsheader und melden Sie die Standardheaderprobleme an denjenigen, der die Verteilung des Betriebssystems verwaltet.

2
Craig Mc

Ich denke, dass Sie stattdessen Folgendes tun müssen:

pid_t pid = fork();

Um mehr über die Linux-API zu erfahren, gehen Sie zu dieser Online-Handbuchseite oder gehen Sie gleich in Ihr Terminal und geben Sie Folgendes ein:

man fork

Viel Glück!

0
2fewChars