2012-03-08 32 views
11

Dưới đây là mã của tôi (được tạo ra chỉ để kiểm tra fork()):Tại sao trình biên dịch của tôi không chấp nhận fork(), mặc dù tôi có bao gồm <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; 
} 

tôi nhận được cảnh báo sau đây:

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

Điều gì là sai với nó?

+1

Bạn đã cài đặt các tiêu đề của thư viện C chưa? Làm thế nào bạn gọi trình biên dịch của bạn? –

+4

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

+0

Bạn có chắc chắn fork() là một phần của stdio.h không? nó không phải là theo http://www.cplusplus.com/reference/clibrary/cstdio/. có thể có xung đột với một tệp tiêu đề khác mà bạn đang đưa vào? – moesef

Trả lời

28

unistd.hfork là một phần của POSIX standard. Chúng không có sẵn trên cửa sổ (text.exe trong lệnh gcc của bạn gợi ý rằng bạn không ở trên * nix).

Dường như bạn đang sử dụng gcc như một phần của MinGW, cung cấp tiêu đề unistd.h nhưng không triển khai các chức năng như fork. Cygwinkhông cung cấp việc triển khai các chức năng như fork.

Tuy nhiên, vì đây là bài tập về nhà nên bạn đã có hướng dẫn về cách lấy môi trường làm việc.

+2

OP có '' có sẵn; nếu không gcc sẽ báo cáo lỗi nghiêm trọng cho tệp tiêu đề bị thiếu. –

+2

MinGW không thực hiện fork(), bạn có thể thử Cygwin (hoặc một hệ thống POSIX thực) nếu bạn thực sự cần fork(). Hoặc, bạn có thể thử một chức năng cửa sổ tương tự. –

+4

Mặc dù Cygwin thực hiện 'fork()', [nó không đẹp] (http://cygwin.com/cygwin-ug-net/highlights.html#ov-hi-process). –

3

Bạn đã có #include <unistd.h> là nơi được tuyên bố là fork().

Vì vậy, bạn có thể cần phải yêu cầu hệ thống để hiển thị các định nghĩa POSIX trước khi bạn bao gồm các tiêu đề hệ thống:

#define _XOPEN_SOURCE 600 

Bạn có thể sử dụng 700 nếu bạn nghĩ rằng hệ thống của bạn chủ yếu là POSIX 2008 tuân thủ, hoặc thậm chí 500 cho một hệ thống cũ hơn. Bởi vì fork() đã tồn tại mãi mãi, nó sẽ hiển thị với bất kỳ thứ gì trong số đó.

Nếu bạn đang biên dịch với -std=c99 --pedantic, thì tất cả các khai báo cho POSIX sẽ bị ẩn trừ khi bạn yêu cầu chúng một cách rõ ràng như được hiển thị.

Bạn cũng có thể chơi với _POSIX_C_SOURCE, nhưng sử dụng _XOPEN_SOURCE ngụ ý chính xác tương ứng _POSIX_C_SOURCE (và _POSIX_SOURCE, v.v.).

+1

với gcc và glibc, macro thử nghiệm tính năng [không thực sự bắt buộc] (http: // linux .die.net/man/2/fork) cho 'fork'. Bao gồm [unistd.h] (http://linux.die.net/include/unistd.h) là đủ. Tiêu chuẩn nêu rõ rằng các ứng dụng nên xác định '_POSIX_C_SOURCE' trước khi bao gồm tiêu đề. – strcat

2

Như bạn đã lưu ý, ngã ba() phải được xác định trong unistd.h - ít nhất là theo các trang hướng dẫn đi kèm với Ubuntu 11.10. Tối thiểu:

#include <unistd.h> 

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

    procID = fork(); 
    return procID; 
} 

... xây dựng không có cảnh báo trên 11.10.

Phát biểu, bạn đang sử dụng phân phối UNIX/Linux nào? Ví dụ, tôi đã tìm thấy một số chức năng không đáng chú ý cần được xác định trong các tiêu đề của Ubuntu 11.10. Chẳng hạn như:

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

Miễn là chúng được xác định trong thư viện C của bạn, đó không phải là vấn đề lớn. Chỉ cần xác định nguyên mẫu của riêng bạn trong tiêu đề tương thích và báo cáo các vấn đề tiêu đề chuẩn cho bất kỳ ai duy trì phân phối hệ điều hành của bạn.

+3

'fork' có sẵn trên nhiều hệ thống" GNU/Linux "- nó có sẵn ở bất cứ nơi nào POSIX được hỗ trợ, bao gồm GNU/Hurd, Unix, BSD, v.v. (Và cho bản ghi, tôi tin rằng OP là trên Windows đưa ra ý kiến ​​của mình) –

+1

(Oh, quên Solaris và MacOSX, nó có sẵn có quá) –

+1

Thực ra, tôi đã nói "UNIX/Linux", nhưng có, ngã ba() là một tính năng POSIX. Chỉ vì hệ điều hành máy chủ lưu trữ của bạn cung cấp unistd.h, không có nghĩa là nó hỗ trợ các tính năng POSIX (mà thực sự là điểm chính của unistd.h [link] (http://en.wikipedia.org/wiki/Unistd.h)). Liên kết đó cung cấp một đầu mối. Có lẽ OP cần cài đặt Cygwin để cung cấp một số cầu nối POSIX/Windows. Hoặc chỉ cần sử dụng một hệ điều hành máy chủ lưu trữ khác. –

0

Tôi nghĩ rằng bạn phải làm như sau thay vì:

pid_t pid = fork(); 

Để tìm hiểu thêm về Linux API, truy cập this online manual page, hoặc thậm chí đi vào thiết bị đầu cuối của bạn ngay bây giờ và chủng loại,

man fork 

Chúc may mắn!

Các vấn đề liên quan