【问题标题】:Catching shell script output in program c在程序 c 中捕获 shell 脚本输出
【发布时间】:2023-04-07 05:45:02
【问题描述】:

我有调用 shell 脚本 (command.sh) 的 C 程序 (program.c)。 command.sh 返回一个输出(密码),我需要在我的 program.c 中获取此输出。 使用 system(command); ,我无法掌握输出。 C 语言中还有其他方法可以解决我的问题吗?

【问题讨论】:

  • 是否需要使用system()(这是作业)?
  • @pilcrow 我寻找另一种方式,如果存在的话。 (这不是家庭作业;))

标签: c shell


【解决方案1】:

不是纯 C。你需要 POSIX。具体popen函数。

规范有一个很好的例子,你可以 1:1 复制 http://pubs.opengroup.org/onlinepubs/009604499/functions/popen.html

【讨论】:

  • 我希望有一种机制可以将内存用作我的程序 c 和脚本 shell 之间的中间体。我不会使用文件。谢谢
  • @Aymanadou 是的,这个解决方案使用了一个 PIPE,这只是一个缓冲区。
【解决方案2】:

听起来你害怕使用库。请尝试使用库,它们与 shell 工具一样是 Unix 的一部分。

【讨论】:

    【解决方案3】:

    在纯 C 中(嗯...忽略 system() 调用的内容),您可以将 shell 脚本输出重定向到一个文件,然后读取该文件。

    system("whatever > file");
    handle = fopen("file", "r");
    /* if ok use handle */
    fclose(handle);
    

    【讨论】:

      【解决方案4】:

      您可以按照上面的建议使用popen(),但请注意,在这种情况下,您无法控制您创建的进程(例如,您将无法杀死它),您也不会知道它的退出状态。

      我建议使用经典的 pipe/fork/exec 组合。然后您将知道您的子进程的 pid,因此您将能够发送信号,也可以使用 pipe() 重定向进程标准输出,因此您可以轻松地在父进程中读取它。例如,您可以查看我对popen() alternative 的接受回答。

      【讨论】:

        【解决方案5】:

        您应该使用popen 打开管道,但这听起来很乏味。一个 C 程序调用一个 shell 脚本来获取密码。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-11
          • 2022-11-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多