2017-04-13 52 views
0

我想實現一個仿真以下shell命令行一個C程序:排序:Stat失敗 - :錯誤的文件描述符

find . -type f -ls | cut -d " " -f 3- | sort -n -k 6 >file.txt ; less <file.txt 

我是很新的工藝,管道和套接字和後嘗試幾個實現,並試圖尋找問題的解決方案,我相信我還沒有足夠的技巧來自己理解錯誤。 有人能解釋我在這裏做錯了嗎?當我嘗試執行代碼,我得到的錯誤:

sort: stat failed: -: Bad file descriptor. 

這裏與sort命令相關的我的孩子功能:

// child 3 (sort) 
    void child3(int *pipe_fd) 
    { 
    int fdo; 

    // fecha parte do write do pipe 
    if (close(pipe_fd[1]) == -1) erro("child 3-> failed to close pipe[1] (pipe_fd)"); 

    // alteração std_in ler do pipe 
     if(dup2(pipe_fd[0], 0) == -1) erro("child 3 -> failed to dup2 (pipe_fd)"); 

    // "fechar o file descriptor do pipe" pois já o redirecionamos 
     if(close(pipe_fd[0]) == -1) erro("child 3 -> failed to close pipe[0]"); 

    // criação do file.txt com direitos de escrita e leitura 
    if (fdo=open("file.txt", O_CREAT|O_WRONLY, 0600) == -1) 
    erro("child_3 failed to open/create 'file.txt'"); 

    // redirecionamento do stdout para o sort 
    if(dup2(fdo, 1) == -1) erro("child 3 -> failed to dup2 (fdo)");   

    // fecho do file descriptor criado no open 
    if(close(fdo) == -1) erro("child 3 -> failed to close pipe[1]"); 

    // executa o sort 
     if (execlp("sort", "sort", "-n", "-k", "6",NULL) == -1) 
    erro("child_3 failed to execlp"); 

    } 

在此先感謝和我很抱歉,如果後期不結構正確,這是我在這裏的第一篇文章。 :)

+1

與其傾倒你的整個程序供我們調試,不如提供一個[mcve]。 –

+0

@PaulR對不起,我得到它 – Aereth

+0

沒問題 - 作爲獎勵你可能會發現,在減少這個過程到一個最小的例子,無論如何你發現你的錯誤! ;-) –

回答

3

的錯誤是相當簡單的,並已與你編譯gcc -Wall,你會收到一個警告:

warning: suggest parentheses around assignment used as truth value [-Wparentheses] 
     if (fdo=open("file.txt", O_CREAT|O_WRONLY, 0600) == -1) { 
     ^~ 

這表明,一個分配表達被括號。和正確的包圍應

if ((fdo = open("file.txt", O_CREAT|O_WRONLY, 0600)) == -1) { 

沒有括號的==的優先級比的=,從而表達被解析爲

if (fdo = (open("file.txt", O_CREAT|O_WRONLY, 0600) == -1)) { 

因此fdo將被設置爲0更高,如果open成功如果失敗,則爲1。由於它成功地在這裏,fdo0和線

if (close(fdo) == -1) 

將最終關閉這本來是爲sort標準輸入描述符0,因此sort抱怨作爲fstat(0, ...)將返回EBADF

+0

我不敢相信這是一個愚蠢的錯誤,我會記住下一個問題的標誌。非常感謝你的幫助! :) – Aereth

+1

@Aereth你看不到這個bug,因爲把所有的東西放到if語句的條件中意味着發生了太多事情。這是一個很好的理由,因爲*永遠不會*把任務放到這樣的條件中。兩行很容易*看*並理解:'int fdo = open(...);如果(fdo == -1)...'很難解決。 –

+0

@AndrewHenle事實上,我應該對自己的代碼更加耐心,我沒有長時間編程,爲了保持組織和清潔,我仍然需要做很多事情。非常感謝你的洞察力,我會注意到,所以我儘量不要在未來陷入困境! – Aereth

相關問題