2014-02-27 41 views
0

我試圖重定向使用下一個代碼從一個Arduino(USB),以在計算機的一些文件的輸出:如何正確使用execl?

#include <stdio.h> 
#include <stdlib.h> 
#include <signal.h> 

int main() 
{ 

    pid_t pid; 
    pid = fork(); 
    if (pid == 0) { 
    execl("/bin/cat","cat /dev/cu.usbmodem1421 - 9600 >> data.txt",NULL); 

    } 
    printf("Cuando desee terminar la recolección de datos presione cualquier tecla: "); 

    getchar(); 
    kill(pid, SIGKILL); 
    return 0; 
} 

使用ps來驗證,如果一切都很好,我可以看到進程落後於我主程序。停止程序後,數據文件沒有任何內容。我試圖使用system(),這有點討厭,因爲我需要使用OSX終端手動終止程序。我認爲也許syntaxis是錯誤的,我所需要的是添加另一個參數,但似乎沒有任何工作。

回答

0

書面,你的代碼執行/bin/cat的名稱(的argv [0])的:

cat /dev/cu.usbmodem1421 - 9600 >> data.txt 

,並沒有其他的參數,所以它從標準輸入中讀取數據並寫入其標準輸出,然後坐在它的周圍,直到它檢測到標準輸入的EOF(或者你殺死它)。

最簡單的選擇是使用system()來運行該命令。

如果失敗,則需要將字符串拆分爲單獨的參數,並處理子級中的I/O重定向。請注意,代碼將從3個文件中讀取:

/dev/cu.usbmodem1421 
- 
9600 

第二個將被解釋爲標準輸入。如果9600的速度是調制解調器的速度,那麼cat是錯誤的命令。

0

好像你正在做fork/execl做一些你可以使用簡單的文件I/O做的事情。

這就是說... execl語法是,你分別傳遞每個參數,後跟一個空指針。所以,像這樣(把你的命令從字面上...):

execl("/bin/cat", "/dev/cu.usbmodem1421", "-", "9600", ">>", "data.txt", (char *) NULL); 
+0

'>>「data.txt」'不是一個參數,它是一個在這裏無法使用的shell操作。 – Nabla

+0

夠公平的。就像我說的,我正在從字面上領悟他的命令,給他一個功能的例子。您提供了另一個不嘗試這樣做的理由,而是使用文件I/O來完成任務。 – John