在C中使用后立即终止cat命令

时间:2016-09-01 16:51:44

标签: c cat tty

所以我通过使用echo发送和cat接收来与设备通信。这是我的代码片段:

\n

好的,问题是,cat似乎保持打开状态,因为当我在循环中运行此代码时,它第一次运行,然后挂在我称之为popen的位置。假设猫是罪魁祸首我是否正确?

有没有办法在我运行命令后立即终止cat,所以我只是从我的设备获得响应?谢谢!

2 个答案:

答案 0 :(得分:2)

在命令中:

echo "xyz" > /dev/ttyACM0 | cat - /dev/ttyACM0

TTY设备通常在载波存在或CLOCAL设置之前不会打开。猫可能在等待开放。假设设备打开,那么猫将等待读取字符,直到(1)它收到一个EOF字符,如control-D,或(2)载体丢失或(3)你杀了它。

这里的另一个问题是echo和cat之间的管道会立即关闭,因为echo的输出被重定向到同一个TTY设备,重定向会关闭管道。

一般来说,TTY设备是野兽,需要特殊处理才能使逻辑正确。可能你最好阅读TTY设备,特别是:

man termios

如果你正在做一些非常简单的事情,你可能会接受:

fp = popen("echo 'xyz' >/dev/ttyACM0 & (read x; echo \"$x\")");

请记住,echo和read都可能会挂起等待运营商,并且你最多会从popen获得一行输出,并且read可能会挂起等待EOL字符。

这整个方法充满了问题。 TTY设备需要精心呵护。你在黑暗中使用锤子。

答案 1 :(得分:2)

没有简单的方法来杀死popen启动的进程,因为没有API来获取pid - 只有pclose等待它自己的帐户结束(并且你应该< em>总是使用pclose代替fclose关闭FILE *打开的popen。)

相反,你可能最好不要使用popen - 只需使用fopen并用fputs写下你想要的东西:

fp = fopen("/dev/ttyACM0", "r+");
fputs("xyz\n", fp);   // include the newline explicitly
fflush(fp);           // always flush after writing before reading
while (fgets(ret_val, sizeof(ret_val)-1, fp) != NULL) {
           :