2014-12-05 48 views
0

我試圖通過ttyS0使用cu(谷歌「cu unix」來了解更多關於cu的信息)與另一個UNIX設備進行通信。我的程序工作得很好,但問題是,在第一次執行程序(建立連接,讀取日誌文件和其他東西)之後,終端無法再訪問。我剛剛發佈了我的問題的核心代碼的簡化版本,我只專注於我的實際問題:用C程序啓動和終止cu

當我手動執行這些命令「cu -l/dev/ttyS0 -s 115200「和」〜「。 (就像在cu的手冊頁中所示:〜。終止連接)一切正常。像

system("cu -l /dev/ttyS0 -s 115200"); 
system("~."); 

順序程序無法正常工作,因爲銅依然活躍,並沒有什麼後執行....程序只是坐在那裏等待立方米......同樣的事情會發生在一個簡單的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

你知道'系統'產生一個新的過程,對吧?而且你不應該在多線程的過程中做到這一點('fork')? – zoska 2014-12-05 10:42:22

+0

你期望什麼'system(「〜。」);'去做? – user3629249 2014-12-05 11:23:18

+0

答案在我的文章中:「當我手動執行這些命令」cu -l/dev/ttyS0 -s 115200「和」〜「時(就像在cu:〜的手冊頁中所述),終止連接)一切正常。「請在提問前閱讀。 – Buitenlander 2014-12-05 11:44:55

回答

1

當你的手去做,你鍵入~.未作爲一個系統命令,但作爲輸入仍在運行的進程。最好的證明是當時你沒有shell提示符。

所以相當於不要做另一個system("~."),而是將這些字符作爲輸入傳遞給第一個system("cu ...")。 例如:

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

顯然,這並不讓你開出「銅」連接,併發送「〜」。晚些時候。如果你想這樣做,我建議你看看popen命令(man 3 popen)。這將啓動一個cu進程,併爲您留下一個文件描述符,稍後您可以在其中編寫~.