我正在尝试使用cu(google“cu unix”来通过ttyS0与另一台UNIX设备进行通信,以了解有关cu的更多信息)。我的程序工作得很好,但问题是,在第一次执行程序(建立连接,读取日志文件和其他一些东西)后,终端不再可访问。我刚刚在代码的简化版本中发布了我的问题的核心,我只关注我的实际问题:
当我手动执行这些命令时“cu -l / dev / ttyS0 -s 115200”和“〜”。 (就像在铜的手册页中:〜。终止连接)一切正常。像
这样的顺序程序system("cu -l /dev/ttyS0 -s 115200");
system("~.");
不起作用,因为cu仍处于活动状态,之后没有执行任何内容....程序只是坐在那里等待cu ...同样的事情会发生在一个简单的bash脚本中... cu将是防止程序/脚本继续 - 这就是为什么我使用线程,就像我说的,我的实际程序工作,但程序没有像我想要的那样终止,终端必须重新启动。 当我执行以下程序时,我只得到
Connected
sh: ~.: not found
按Enter
cu: can't restore terminal: Input/Output error
Disconnected
并且无法使用的终端处于打开状态(无法输入或执行任何操作)...
#define _BSD_SOURCE
#include <termios.h>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <time.h>
#include <stdlib.h>
#include <pthread.h>
void first(){
system("cu -l /dev/ttyS0 -s 115200");
pthread_exit(NULL);
}
void second(){
system("~."); //also "~.\n" isn't changing anything
pthread_exit(NULL);
int main(){
pthread_t thread1, thread2;
pthread_create ( &thread1, NULL, (void*)first, NULL );
sleep(3);
pthread_create ( &thread2, NULL, (void*)second, NULL );
sleep(4);
exit(0);
return 0;
}
答案 0 :(得分:1)
当您手动执行此操作时,您输入的~.
不会被视为系统命令,而是作为仍在运行的cu
进程的输入。最好的证据是你当时没有shell提示符。
所以等效的不是做另一个system("~.")
,而是将这些字符作为输入传递给第一个system("cu ...")
。
例如:
system("echo '~.' | cu ....");
显然,这并不能让你打开一个&#34; cu&#34;连接并发送&#34;〜。&#34;晚些时候。如果您希望这样做,我建议您查看popen
命令(man 3 popen
)。这将启动cu
进程,并为您提供一个文件描述符,您可以在以后编写~.
。