2016-01-31 33 views
2

因此,我正在寫一個簡單的外殼在C,可以做標準輸入重定向。我正在從用戶那裏讀取一個字符串,將它拆分爲參數,然後將其提供給exec。但是,當我將輸出重定向到第一個時:創建我請求的文件並使用正確的數據填充它,然後將命令結果無限打印在終端中。我在用dup2做錯了什麼?外殼重定向導致無限打印到終端

這是我的重定向代碼。所有使用的變量都是全局變量,除了文件描述符。

int execRedirectCommand(){ 
    int fd; 

    pid_t pid = fork(); 


    // fork failed 
    if(pid == -1){ 
     char* error = strerror(errno); 
     printf("fork: %s\n", error); 
     return -1; 
    } 
    //Child process 
    else if(pid == 0){ 
     fd = open(fileName, O_WRONLY | O_CREAT | O_TRUNC, 0755); 
     if(fd == -1){ 
      char* error = strerror(errno); 
      printf("open:%s\n", error); 
      return -1; 
     } 
     dup2(fd, STDOUT_FILENO); 
     close(fd); 

     execvp(payloadArgv[0], payloadArgv); 

     // execvp failed 
     char* error = strerror(errno); 
     printf("pdsh:%s:%s\n", payloadArgv[0], error); 
     return -1; 
    } 
    // Parent process 
    else{ 
     close(fd); 
     fileName = NULL; 

     // Wait for child process to finish 
     int childStatus; 
     waitpid(pid, &childStatus, 0); 
     return 0; 
    } 
} 

編輯固定的代碼沒有大的一個錯字。 EDIT 2包括我的主:

int main(){ 
    setSigHandler(); 
    char* user = getlogin(); 


    while(1){ 
     printf("[%s]-->$", user); 
     getNextCommand(payload); 

     if(!strcmp(payload, "\n")) continue; 

     if(!strcmp(payload, "close")) break; 


     parseCommandString(); 


     if(fileName != NULL){ 
      execRedirectCommand(); 
     }else{ 
      execSimpleCommand(); 
     } 


    } 

    return 0; } 

注:無標準輸出重定向的工作就好了命令。

+1

也許問題是與colde調用此函數?我唯一能發現的地方就是錯誤的是,你正在從未打開/初始化過的parend進程中關閉'fd'。 – mata

+0

@mata因爲我分叉不父母也獲得該文件的副本?編輯:添加我的主。 – Akaitenshi

+0

@meta似乎確實解決了這個問題,但我的問題仍然存在:父母是否也獲得了該文件的副本? – Akaitenshi

回答

1

感謝mata和nsilent22指出。父進程中的close(fd)不是必需的。