使用C程序启动和终止cu

时间:2014-12-05 10:37:14

标签: c unix

我正在尝试使用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;
}

1 个答案:

答案 0 :(得分:1)

当您手动执行此操作时,您输入的~.不会被视为系统命令,而是作为仍在运行的cu进程的输入。最好的证据是你当时没有shell提示符。

所以等效的不是做另一个system("~."),而是将这些字符作为输入传递给第一个system("cu ...")。 例如:

system("echo '~.' | cu ....");

显然,这并不能让你打开一个&#34; cu&#34;连接并发送&#34;〜。&#34;晚些时候。如果您希望这样做,我建议您查看popen命令(man 3 popen)。这将启动cu进程,并为您提供一个文件描述符,您可以在以后编写~.