在 C 程序中执行程序

2024-11-04 08:43:00
admin
原创
147
摘要:问题描述:我应该如何在我的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

为了这 。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1120  
  IPD(Integrated Product Development,集成产品开发)流程是一种广泛应用于高科技和制造业的产品开发方法论。它通过跨职能团队的紧密协作,将产品开发周期缩短,同时提高产品质量和市场成功率。在IPD流程中,CDCP(Concept Decision Checkpoint,概念决策检查点)是一个关...
IPD培训课程   75  
  研发IPD(集成产品开发)流程作为一种系统化的产品开发方法,已经在许多行业中得到广泛应用。它不仅能够提升产品开发的效率和质量,还能够通过优化流程和资源分配,显著提高客户满意度。客户满意度是企业长期成功的关键因素之一,而IPD流程通过其独特的结构和机制,能够确保产品从概念到市场交付的每个环节都围绕客户需求展开。本文将深入...
IPD流程   66  
  IPD(Integrated Product Development,集成产品开发)流程是一种以跨职能团队协作为核心的产品开发方法,旨在通过优化资源分配、提高沟通效率以及减少返工,从而缩短项目周期并提升产品质量。随着企业对产品上市速度的要求越来越高,IPD流程的应用价值愈发凸显。通过整合产品开发过程中的各个环节,IPD...
IPD项目管理咨询   76  
  跨部门沟通是企业运营中不可或缺的一环,尤其在复杂的产品开发过程中,不同部门之间的协作效率直接影响项目的成败。集成产品开发(IPD)作为一种系统化的项目管理方法,旨在通过优化流程和增强团队协作来提升产品开发的效率和质量。然而,跨部门沟通的复杂性往往成为IPD实施中的一大挑战。部门之间的目标差异、信息不对称以及沟通渠道不畅...
IPD是什么意思   70  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用