2014-02-11 48 views
0

我想在TCL腳本和C代碼之間建立連接。TCL和C中的讀/寫FIFO,垃圾輸出

這裏是TCL腳本

set fs[open "./fifo_server" "w"] 
puts $fs "level_3" 
flush $fs 

這裏是C代碼

if ((fs = fopen ("./fifo_server", "r"))== NULL) 
    perror ("error occured while opening FIFO_SERVER"); 
    else { 
    fs1 = fileno(fs); 
    read(fs1, in_data, sizeof(in_data)); 
    } 
    printf ("in_data = %s\n", in_data); 

輸出看起來像:

in_data = level_3 
(some garbage stuff 5 spaces which contains Question marks, Squares, 
Characters etc.) 

我不明白,什麼可能是垃圾線的原因?

感謝您的精確和早期的幫助。

感謝和問候, M.

+1

對於一個使用'組FS [開「./fifo_server」,‘W’]'來代替。 Tcl中的空間很重要。 – Jerry

+0

爲什麼你使用'fileno'和'read'而不是'fread'?或者,相反,'fopen'而不是'open'?儘量避免爲一個文件描述符/句柄使用兩個API ... –

+0

@Jerry我認爲這必須是一個轉錄錯誤,否則代碼永遠不會像報告的那樣工作。 –

回答

2

首先,隨着傑裏指出,你所需要的變量fs和方括號之間的空間:

set fs [open "./fifo_server" "w"] 

我不知道爲什麼您以這種低級方式讀取文件(即使用文件編號,而不是FILE *句柄)。但是,你需要自己終止您的字符串,因爲read()不會自動這麼做:

int chars_read; /* How many chars read from a file */ 

if ((fs = fopen ("./fifo_server", "r")) == NULL) 
    perror ("error occured while opening FIFO_SERVER"); 
else { 
    fs1 = fileno(fs); 
    chars_read = read(fs1, in_data, sizeof(in_data)); 
    in_data[chars_read] = '\0'; /* terminate your string */ 
} 
printf ("in_data = %s\n", in_data); 
+0

對我來說,這看起來像是個問題,因爲所有預期的字節在*垃圾之前也存在*。經典超限症狀。 –

+0

我不認爲這是一個超限問題。 'read()'和'fread()'被設計爲讀取原始數據。在這樣的情況下,它們不會NULL結束你的緩衝區。 –

+0

不;因爲數據沒有終止,所以'printf()'發生溢出。這不是'read()'的錯,它正在做它記錄下來的事情。 –