【问题标题】:fork() mysteriously includedfork() 神秘地包含在内
【发布时间】:2017-04-09 21:37:01
【问题描述】:

这是使用 fork() 来展示其工作原理的代码 (fork.c)。

gcc --version 显示gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4

#include <stdio.h>
int num = 0;
int main(int argc, char*argv[]){
    int pid;
    pid = fork();       
    if(pid == 0){       /*child*/
        num = 1;
    }else if(pid > 0){  /*parent*/
        num = 2;
    }
    printf("%d", num);
}

然后gcc fork.c -o fork 进行编译。它编译没有任何错误,并且可执行文件正确运行。但是我没有明确包含头文件unistd.h,我也检查了所有递归包含的头文件(gcc -H

. /usr/include/stdio.h
.. /usr/include/features.h
... /usr/include/x86_64-linux-gnu/sys/cdefs.h
.... /usr/include/x86_64-linux-gnu/bits/wordsize.h
... /usr/include/x86_64-linux-gnu/gnu/stubs.h
.... /usr/include/x86_64-linux-gnu/gnu/stubs-64.h
.. /usr/lib/gcc/x86_64-linux-gnu/4.8/include/stddef.h
.. /usr/include/x86_64-linux-gnu/bits/types.h
... /usr/include/x86_64-linux-gnu/bits/wordsize.h
... /usr/include/x86_64-linux-gnu/bits/typesizes.h
.. /usr/include/libio.h
... /usr/include/_G_config.h
.... /usr/lib/gcc/x86_64-linux-gnu/4.8/include/stddef.h
.... /usr/include/wchar.h
... /usr/lib/gcc/x86_64-linux-gnu/4.8/include/stdarg.h
.. /usr/include/x86_64-linux-gnu/bits/stdio_lim.h
.. /usr/include/x86_64-linux-gnu/bits/sys_errlist.h

然后我在所有文件中都做了grep,但我没有找到任何 fork() 声明。

如果从未在任何头文件中声明 fork(),它如何编译而不会出现任何错误?还是我错过了什么?

【问题讨论】:

  • C 允许隐式函数定义,它只获得int fork()原型:int 返回值和任意数量的参数。不过,编译器应该发出警告
  • 使用gcc -std=c11 -Wall -Wextra -Werror 继续。在我对编译感到满意之前,我有更多选择。

标签: c linux gcc posix


【解决方案1】:

在旧版本的 C(C99 之前:C89 或 K&R C)中,调用函数不需要声明。然后您有责任提供正确数量和类型的参数,并且假定返回值的类型为int。编译器不为这种情况提供任何正确性检查。

但是,编译器应该为此发出警告。这就是 GCC 6.3 给出的:

main.cpp: In function 'main':
main.cpp:5:11: warning: implicit declaration of function 'fork' [-Wimplicit-function-declaration]
    pid = fork();
          ^~~~

【讨论】:

    【解决方案2】:

    除了 Ilya Popov 所说的关于声明的内容之外,函数 fork() 包含在标准 C 库 libc 中,当您构建项目时,它与目标文件隐式链接。这种包含并不能保证该函数被正确调用,但它保证它的存在。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-01
      • 2011-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多