【问题标题】:The unistd.h or stdlib.h when creating child processes in Linux在 Linux 中创建子进程时的 unistd.h 或 stdlib.h
【发布时间】:2015-11-15 19:00:21
【问题描述】:

我想知道在创建子进程和通过管道建立通信时,头文件 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);
}

【问题讨论】:

  • 首先要知道的是它们不是图书馆!你确定吗? AFAIK read(), write() ... 等,仅在 uinstd.h 中声明,exit() 虽然在 stdlib.h 中声明。
  • 是的,完全确定!,我有一个程序可以创建 10 个从父亲那里接收消息的子进程,我只包括 ,一切正常,管道、叉子、关闭功能我没有收到错误。我有 ubuntu,我用 KWRITE 编辑脚本。
  • 你检查文件内容了吗?
  • 我刚刚尝试用 nano 使用相同的库来运行相同的程序,并且工作正常。
  • 和你使用的文本编辑器无关!我认为您需要了解事情的真正运作方式,并摆脱 Windows 操作系统教我们的方式。

标签: c linux operating-system


【解决方案1】:

函数exit()在C标准中定义,它的声明被指定属于&lt;stdlib.h&gt;

open()read()fork()pipe() 等是 Posix 系统调用,不包含在 C 标准中。 Posix 指定它们中的大多数应该在&lt;unistd.h&gt; 中声明(尽管open() 来自&lt;fcntl.h&gt;)。

一些旧系统过去常常混合或复制这些声明,但现代环境不再这样做,以符合这些标准。

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-27
      • 1970-01-01
      • 1970-01-01
      • 2011-08-18
      • 1970-01-01
      • 2013-07-31
      • 2015-07-23
      相关资源
      最近更新 更多