繁体   English   中英

在Linux中创建子进程时的unistd.h或stdlib.h

[英]The unistd.h or stdlib.h when creating child processes in Linux

我想知道在创建子进程和通过管道建立通信时,标头unistd.h和stdlib.h之间有什么区别...

在这些情况下,我们使用的系统调用函数为read()write()wait()pipe()fork()exit() 而且似乎stdlib.h库也包含它们,为什么在stackoverflow或其他站点中的所有示例都包含两个标头?

示范:

打开控制台并编写nano program.c ,粘贴以下代码。 然后使用gcc program.c -o program编译它,您将获得pid:

#include <stdio.h>
#include <stdlib.h>

int main()
{
   int pid;
   pid = fork();
   printf("EL pid %i\n", pid);
}

函数exit()在C标准中定义,其声明指定为<stdlib.h>所属。

open()read()fork()pipe()等是Posix系统调用,C标准未涵盖。 Posix指定其中大多数应在<unistd.h>声明(尽管open()来自<fcntl.h> )。

一些较旧的系统曾经用来混合或复制这些声明,但是为了符合这些标准,现代环境不再使用。

请注意,原始的C标准允许编译器猜测未知函数的原型。 C99和C11没有。 您的示例代码将使用适当的编译器进行编译,并产生正确的输出,因为所使用的系统调用具有非常基本的API。 使用-Wall -Werror -std=c99编译相同的代码将无法生成可执行文件。

这种方式的编程被认为是草率的,不再受支持。 C有足够的陷阱,因为它不再宽容这种样式。 Stack Overflow上的人们大多数时候都坚持编写正确的代码,因此要包含正确的标头。

因为这些函数是在不同的头文件中声明的。

例如exit()在stdlib.h中声明, pipe()在unistd.h中声明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM