c - Hvorfor accepterer min compiler ikke gaffel (), på trods af at jeg har inkluderet < unistd.h > ;?

Indlæg af Hanne Mølgaard Plasc

Problem



Her er min kode (lavet for at teste gaffel ()):


#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
");
        printf("my pid=\%d
", getpid());
    }

    return 0;
}


Jeg får følgende advarsler:


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


Hvad er der galt med det?

Bedste reference


unistd.h og fork er en del af POSIX-standarden. De er ikke tilgængelige på Windows (text.exe i din Gcc-kommando antydes, at 'du er' ikke på * Nix). [22]


Det ser ud til at du bruger gcc som en del af MinGW, som giver unistd.h header, men implementerer ikke funktioner som fork. Cygwin gør til rådighed for implementeringer af funktioner som [[fork. [23] [24]


Men da dette er lektier, skal du allerede have instruktioner om, hvordan man får et arbejdsmiljø.

Andre referencer 1


Du har #include <unistd.h>, hvilket er hvor fork() er erklæret.


Så du skal sikkert fortælle systemet at vise POSIX-definitionerne, før du inkluderer systemoverskrifterne:


#define \_XOPEN\_SOURCE 600


Du kan bruge 700, hvis du mener, at dit system hovedsageligt er POSIX 2008-kompatibelt, eller endda 500 for et ældre system. Fordi fork() har eksisteret for evigt, vil det dukke op med nogen af ​​dem.


Hvis du kompilerer med -std=c99 --pedantic, vil alle deklarationer for POSIX blive gemt, medmindre du udtrykkeligt anmoder dem som vist.


Du kan også spille med \_POSIX\_C\_SOURCE, men bruger \_XOPEN\_SOURCE indebærer den korrekte tilsvarende \_POSIX\_C\_SOURCE (og \_POSIX\_SOURCE og så videre.

Andre referencer 2


Som du allerede har bemærket, skal gaffel () defineres i unistd.h - i det mindste ifølge de mandsider, der følger med Ubuntu 11.10. Den minimale:


#include <unistd.h>

int main( int argc, char* argv[])
{
    pid\_t procID;

    procID = fork();
    return procID;
}


... bygger uden advarsler kl. 11.10.


Taler om hvilken, hvilken UNIX/Linux-distribution bruger du? For eksempel har jeg fundet flere ikke-bemærkelsesværdige funktioner, der skal defineres i Ubuntu 11.10 's headers aren' t. Som:


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


Så længe de 'er defineret i dit C-bibliotek, bliver det ikke et stort problem. Du skal blot definere dine egne prototyper i en kompatibilitetsoverskrift og rapportere standardhovedproblemerne til den, der opretholder din OS-distribution.

Andre referencer 3


Jeg tror, ​​at du skal gøre følgende i stedet:


pid\_t pid = fork();


For at lære mere om Linux API, gå til denne online manuelle side, eller endda gå ind i din terminal lige nu og skriv, [25]


man fork


Held og lykke!