fork() 神秘地包含在内
fork() mysteriously included
这里是使用 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(C99 之前的版本:C89 或 K&R C)中,您不需要声明来调用函数。然后您有责任提供正确的参数数量和类型,并且 return 值被假定为 int
类型。编译器不为这种情况提供任何正确性检查。
然而,编译器应该给你一个警告。这是 GCC 6.3 给出的:
main.cpp: In function 'main':
main.cpp:5:11: warning: implicit declaration of function 'fork' [-Wimplicit-function-declaration]
pid = fork();
^~~~
除了 Ilya Popov 所说的声明之外,函数 fork()
包含在标准 C 库 libc
中,它在您构建项目时与目标文件隐式链接。这种包含并不能保证函数被正确调用,但可以保证它的存在。
这里是使用 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(C99 之前的版本:C89 或 K&R C)中,您不需要声明来调用函数。然后您有责任提供正确的参数数量和类型,并且 return 值被假定为 int
类型。编译器不为这种情况提供任何正确性检查。
然而,编译器应该给你一个警告。这是 GCC 6.3 给出的:
main.cpp: In function 'main':
main.cpp:5:11: warning: implicit declaration of function 'fork' [-Wimplicit-function-declaration]
pid = fork();
^~~~
除了 Ilya Popov 所说的声明之外,函数 fork()
包含在标准 C 库 libc
中,它在您构建项目时与目标文件隐式链接。这种包含并不能保证函数被正确调用,但可以保证它的存在。