在 C 程序中执行程序

2024-11-04 08:43:00
admin
原创
41
摘要:问题描述:我应该如何在我的C程序中运行另一个程序?我需要能够将数据写入STDIN启动的程序(也许还可以从中读取STDOUT)我不确定这是否是标准 C 函数。我需要可以在 Linux 下运行的解决方案。解决方案 1:您想使用popen。它为您提供了一个单向管道,您可以通过它访问程序的标准输入和标准输出。pope...

问题描述:

我应该如何在我的C程序中运行另一个程序?我需要能够将数据写入STDIN启动的程序(也许还可以从中读取STDOUT

我不确定这是否是标准 C 函数。我需要可以在 Linux 下运行的解决方案。


解决方案 1:

您想使用popen。它为您提供了一个单向管道,您可以通过它访问程序的标准输入和标准输出。

popen 是现代 unix 和类 unix 操作系统的标准,其中 Linux 就是其中之一 :-)

类型

man popen

在终端上阅读更多相关信息。

编辑

是否popen生成单向或双向管道取决于实现。在Linux和OpenBSD中,popen生成只读或只写的单向管道。在OS X、FreeBSD和NetBSD popen上生成双向管道。

解决方案 2:

不久前,我为其他人写了一些示例 C 代码,演示了如何执行此操作。下面是供您参考的:

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

void error(char *s);
char *data = "Some input data
";

main()
{
  int in[2], out[2], n, pid;
  char buf[255];

  /* In a pipe, xx[0] is for reading, xx[1] is for writing */
  if (pipe(in) < 0) error("pipe in");
  if (pipe(out) < 0) error("pipe out");

  if ((pid=fork()) == 0) {
    /* This is the child process */

    /* Close stdin, stdout, stderr */
    close(0);
    close(1);
    close(2);
    /* make our pipes, our new stdin,stdout and stderr */
    dup2(in[0],0);
    dup2(out[1],1);
    dup2(out[1],2);

    /* Close the other ends of the pipes that the parent will use, because if
     * we leave these open in the child, the child/parent will not get an EOF
     * when the parent/child closes their end of the pipe.
     */
    close(in[1]);
    close(out[0]);

    /* Over-write the child process with the hexdump binary */
    execl("/usr/bin/hexdump", "hexdump", "-C", (char *)NULL);
    error("Could not exec hexdump");
  }

  printf("Spawned 'hexdump -C' as a child process at pid %d
", pid);

  /* This is the parent process */
  /* Close the pipe ends that the child uses to read from / write to so
   * the when we close the others, an EOF will be transmitted properly.
   */
  close(in[0]);
  close(out[1]);

  printf("<- %s", data);
  /* Write some data to the childs input */
  write(in[1], data, strlen(data));

  /* Because of the small amount of data, the child may block unless we
   * close it's input stream. This sends an EOF to the child on it's
   * stdin.
   */
  close(in[1]);

  /* Read back any output */
  n = read(out[0], buf, 250);
  buf[n] = 0;
  printf("-> %s",buf);
  exit(0);
}

void error(char *s)
{
  perror(s);
  exit(1);
}

解决方案 3:

  1. 创建两个管道pipe(...),一个用于stdin,一个用于stdout

  2. fork(...)該過程。

  3. 在子进程(返回 0 的进程fork(...))中,dup (...)管道到stdin/ stdout

  4. exec[v][e]子进程中要启动的程序文件。

  5. 在父进程(fork)返回子进程的 PID 的进程)中执行循环,从子进程stdoutselect(...)poll(...)read(...))读取到缓冲区,直到子进程终止(waitpid(...))。

  6. 最后,如果孩子有期望的话,就向他们提供输入stdin

  7. close(...)管道完工后。

解决方案 4:

对于简单的单向通信,popen() 是一个不错的解决方案。但是,对于双向通信,它毫无用处。

在我看来,imjorge(Jorge Ferreira)给出了双向沟通的大部分答案(80%?) - 但省略了一些关键细节。

  1. 至关重要的是,父进程关闭用于向子进程发送消息的管道的读取端。

  2. 至关重要的是,子进程关闭用于向子进程发送消息的管道的写入端。

  3. 至关重要的是,父进程关闭用于向父进程发送消息的管道的写入端。

  4. 至关重要的是,子进程要关闭用于向父进程发送消息的管道的读取端。

如果不关闭管道未使用的端,则当某个程序终止时,您将无法得到合理的行为;例如,子程序可能正在从其标准输入读取,但除非子程序中关闭管道的写入端,否则它将永远不会得到 EOF(读取到零字节),因为管道仍然打开,并且系统认为它有时可能会向该管道写入数据,即使它当前正挂起等待从中读取某些内容。

写入进程应该考虑是否处理在没有读取进程的管道上写入时发出的 SIGPIPE 信号。

您必须了解管道容量(取决于平台,可能只有 4KB)并设计程序以避免死锁。

解决方案 5:

您可以使用系统调用,阅读系统手册页(3)

解决方案 6:

我认为你可以使用

freopen

为了这 。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用