【问题标题】:Simple Bash-C communication简单的 Bash-C 通信
【发布时间】:2012-10-23 19:39:00
【问题描述】:

我正在尝试构建一个响应简单 C 程序的脚本。我猜脚本需要逐行阅读并解析文本,直到找到问题。然后它必须回复相同的标准输出。脚本以无限循环读取,我在命令行上启动它

./script.sh &

为了让它在后台运行。然后,在同一个终端中,我启动我的 C 程序,该程序在命令行上输出并在 scanf 处等待。 我的问题是,这两个进程看起来好像正在与不同的标准输出进行交互,因为它们无法“看到”彼此。显然我误解了一些东西......有什么帮助吗?

#!/bin/bash
for (( ; ; )) do
    while read line; do
        if [ "$line" == ">" ] then
        echo "yes"
        fi
    done
done    

【问题讨论】:

标签: c bash unix stdout


【解决方案1】:

使用expect 怎么样? Expect 是一个以编程方式回复交互式应用程序的 Unix 工具,对于解决像您这样的问题非常有用。当然你可以在 bash 脚本中使用它。

您的问题的答案类似于:

#!/bin/bash

expect << EOF
  spawn simple_c_application
  expect ">"
  send "yes\r"
  expect eof
EOF

脚本将生成您的应用程序,为您检查输出并在输出行包含 >时回复yes。您还可以在期望模式中使用锚点:字符 ^ 匹配行首,$ 匹配行尾。所以^&gt;$ 仅在行完全 >时匹配。

您只需从包管理器中安装 expect,然后像往常一样使用 bash 脚本。

【讨论】:

  • Thanx,但我需要使用 bash 脚本来做到这一点。它只是一个更大的测试应用程序但实际上,我的问题是如何在同一个终端中运行两个应用程序来做到这一点。
  • 你可以 :) 我会在一分钟内把完整的脚本发给你
  • 是的,它有效! :-) 但是我不希望脚本启动应用程序...
【解决方案2】:

使用mkfifo 创建一个套接字文件,并使用从该套接字文件而不是stdin 读取的脚本。 在您的 C 程序中,使用 open 打开套接字,然后写入这个而不是标准输出。

例子:

在终端中输入这个来创建一个套接字文件。

user~$ mkfifo mysocket

把你的脚本改成这样:

while :
do
    here=$(<mysocket)
    if [ "$here" == ">" ] then
        echo "yes"
    fi
done

在你的 c 文件中

char* test = ">\n";
int mysocket = open("/home/user/mysocket","w");
int byteswrite = write(mysocket,(void*)test,2);

先运行脚本,然后再运行程序

【讨论】:

  • 从技术上讲,mkfifo 生成的是 fifo,而不是套接字。
  • 它看起来不适合我,但我现在没有时间调试。这个想法是我为应用程序和脚本使用套接字而不是标准输出。这很清楚。我会努力的。感谢您的回复。虽然我想避免使用套接字。
  • 我编辑了从文件中读取的脚本部分,因为 read 对我不起作用......现在它对我有用
猜你喜欢
  • 1970-01-01
  • 2016-09-05
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
  • 1970-01-01
  • 2017-04-03
相关资源
最近更新 更多