2012-11-17 92 views
0

我在c中實現shell時做了這個,但雖然在實現管道時,我想出了這個錯誤ls:write error:Bad file描述符,我不明白爲什麼這個錯誤即將到來, 請幫助。管道實現中的錯誤,我面臨這個錯誤,ls:寫入錯誤:錯誤的文件描述符

#include<stdio.h> 
#include<unistd.h> 
#include <stdlib.h> 
void execute(char **argv) 
{ 
    pid_t pid; 
    int status; 
    //fflush(0); 
    pid_t id ; 
    int out=0,in=0,pip=0; 
    int fds[2]; 

    if ((pid = fork()) < 0) {  /* fork a child process   */ 
     printf("*** ERROR: forking child process failed\n"); 
     exit(1); 
    } 
    if (pid==0) { 
    close(1);  /* close normal stdout */ 
    dup2(fds[1],1); /* make stdout same as pfds[1] */ 
    close(fds[0]); /* we don't need this */ 
    execlp(argv[0],argv[0],argv[1],NULL); 
    } 
    else { 
    close(0);  /* close normal stdin */ 
    dup2(fds[0],0); /* make stdin same as pfds[0] */ 
    close(fds[1]); /* we don't need this */ 
    execlp(argv[3],argv[3],argv[4], NULL); 
    } 


    } 

回答

0

你似乎缺少pipe(fds);呼叫你打電話之前fork()。您還錯過了一些close()調用。如果將管道的一端(與dup()dup2())複製到標準輸入或標準輸出,則應關閉兩個原始描述符pipe()

還有一個強有力的論點,你應該檢查你的系統調用的返回值。你可以使用這樣的函數:

#include <stdarg.h> 
#include <stdio.h> 
#include <string.h> 
#include <errno.h> 
#include <stdlib.h> 

extern void err_exit(const char *fmt, ...); 

void err_exit(const char *fmt, ...) 
{ 
    int errnum = errno; 
    va_list args; 
    va_start(args, fmt); 
    vfprintf(stderr, fmt, args); 
    va_end(args); 
    if (errnum != 0) 
     fprintf(stderr, " (%d: %s)", errnum, strerror(errnum)); 
    fputc('\n', stderr); 
    exit(1); 
} 

你可以用它喜歡:

if (dup2(fds[2], 1) != 0) 
    err_exit("dup2(%d, %d) failed", fds[2], 1); 
+0

耶得到了僅管()調用失蹤感謝 –

相關問題