【问题标题】:Unix - Pipe, forks, execlp, dup2, c programUnix - 管道、叉子、execlp、dup2、c 程序
【发布时间】:2015-05-23 22:15:22
【问题描述】:

这是一个任务。我是 unix 编程的新手,可以使用一些帮助。我需要创建一个执行以下操作的 C 程序:

在 main() 函数中,它使用 pipe() 函数创建一个管道,然后使用 fork() 创建两个子进程。 Child 1 将 stdout 重定向到管道的写入端,然后使用 execlp() 执行“ps -aux”命令。 Child 2 将其输入从标准输入重定向到管道的读取端,然后执行“sort -r -n -k 5”命令。 创建两个子进程后,父进程等待它们终止,然后才能退出。 请注意,您可能必须先创建子 2,然后再创建子 1。 父程序与运行命令“ps -aux | sort -r -n -k 5”的 shell 执行相同的操作。您必须使用 fork()、pipe()、dup2()、close()、execlp() 函数(或其他 exec() 变体)。

我是一名大四的 CS 学生,并且非常精通 Windows 编程,所以我不是在寻求解决方案,只是对具体需要做什么以及各种命令的含义进行翻译。

谢谢

【问题讨论】:

  • 在 Linux 中,了解命令功能的标准方法是阅读“手册页”。来自 shell 类型 man <command>。同样适用于(大多数)库函数。手册页也可在线获得,因此如果您愿意,可以在浏览器中搜索。
  • 您可以在man 页面中找到所有“命令”(我认为您的意思是“函数”)。如果您无法开始作业,请向您的讲师寻求帮助。作为一名大四的 CS 学生,您现在应该知道如何联系该讲师了。我们很乐意帮助完成作业,只要他们符合help center 中的标准:请求家庭作业帮助的问题必须包括您迄今为止为解决问题所做的工作总结,以及描述您在解决它时遇到的困难。 您要求获得 *nix 系统的 C 编程教程。

标签: c linux unix pipe fork


【解决方案1】:

要做的事情:

主进程

  • 创建管道(参见:man pipe()
  • 启动 2 个子进程(参见:man fork
  • 等待他们两个都退出(参见:man wait
  • 退出

孩子 1

  • 重定向标准输出以写入管道末端(参见:man dup
  • 运行 ps -aux(参见:man exec
  • 退出

孩子 2

  • 将管道的读取端重定向到标准输入
  • 运行排序 -r -n -k
  • 退出

关于execlp,您可以在手册页中找到相关信息。 (man exec)。最有趣的 pnrt 可以回答下面引用的问题:

可能是最重要的事情要完成RTFM

这些函数的初始参数是要执行的文件的名称。 execl()、execlp() 和 execle() 函数中的 const char *arg 和后续省略号可被视为 arg0、arg1、...、argn。它们一起描述了一个或多个指向以空字符结尾的字符串的指针列表,这些字符串表示已执行程序可用的参数列表。按照惯例,第一个参数应该指向与正在执行的文件关联的文件名。参数列表必须以 NULL 指针终止,并且由于这些是可变参数函数,因此该指针必须强制转换 (char *) NULL。

特别是不要忘记最后一句并结束您的呼叫参数execlp("ps", "ps", "-aux", NULL);NULL 可能是什么。

【讨论】:

  • 别担心。这是关于试图帮助人们,而不是为了提出观点。不要忘记查看手册页,特别是如果您是 UNIX 新手,您会惊讶于您可以在其中找到的信息量。我试图将最重要的man exec 复制到答案中。确保也阅读提到的其他页面。欢迎来到 UNIX 世界,尽情享受吧,您将再也不想离开它。
猜你喜欢
  • 1970-01-01
  • 2012-02-20
  • 2018-05-23
  • 1970-01-01
  • 1970-01-01
  • 2010-12-14
  • 2017-07-07
  • 2011-04-24
  • 1970-01-01
相关资源
最近更新 更多