【问题标题】:Execute a program in my C code在我的 C 代码中执行一个程序
【发布时间】:2013-06-11 04:46:09
【问题描述】:

我想在我的代码中使用的程序是一个命令行工具。

用户先输入./program,然后用户就可以使用程序提供的一些命令了。

我想在我的源代码中执行两个命令(myCode.cpp):

#include <stdio.h>    
#include <stdlib.h>    
int main ()
{
  int i;
  printf ("Checking if processor is available...");
  if (system(NULL)) puts ("Ok");
    else exit (EXIT_FAILURE);
  printf ("Executing command ...\n");
  system ("./program");
  system ("command1");
  system ("command2");

  return 0;
}

执行我的程序(./myCode)后,程序启动了,但两条命令没有执行。

这两个命令如何执行?

如何终止程序然后执行我的以下代码行? (在system()之后)

【问题讨论】:

  • 您检查过 system() 报告的哪些错误?
  • system 命令在 shell 中执行其参数,因此您的每个调用都独立于其他调用;他们不会将这两个命令传递给程序。请参阅 linux.die.net/man/3/popen 了解如何在 C 程序和 ./program 之间打开管道。
  • 要了解如何通过双向通信启动新进程,请参阅stackoverflow.com/questions/5094063/…

标签: c multithreading terminal system-calls


【解决方案1】:

要实现你想做的,你需要使用popen(),而不是system()

Popen 启动一个新进程来执行您在命令中指定的程序,然后将该程序的输入或输出流映射到您自己的程序中可用的文件描述符。

然后,你就可以通过这个文件描述符和这个程序进行通信了。

你的代码应该看起来像(实际上没有编译):

FILE* file = popen("/path/to/your/program", "w")

if (!file) {
  // Something not nice happened
}


fprintf(file, "command1\n");

//...

pclose(file);

【讨论】:

    【解决方案2】:

    使用popen() 而不是system(),并且假设您的程序从其标准输入中获取命令,请将您的命令写入popen() 返回的FILE*

    FILE* pin = popen("./program", "w");
    fprintf(pin, "command1\n");
    fprintf(pin, "command2\n");
    fflush(pin);
    pclose(pin); // this will wait until ./program terminates
    

    【讨论】:

    • 程序不会终止,除非用户使用"ctrl+c"... pclose(pin) 只是等待而不是终止程序,对吧?
    • pclose 确实在等待。 ./program 必须被其他东西关闭,pclose 才能返回。我建议你在 ./program 中实现一个“quit”命令,然后执行 fwrite(pin, "quit\n")。仅仅杀死父进程可能有点脏。
    猜你喜欢
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    • 2018-01-26
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    相关资源
    最近更新 更多