2016-04-07 78 views
0

嗨我一直在編寫一個shell在c中,並且在嘗試重定向時卡住了。在我的程序中重定向標準輸出的過程中,stdin不會。將輸入和輸出重定向到一個shell中

void redirect(node_t* node){ 
    // mode 0: >$%d mode 1: < mode 2: > mode 3: >> 
    int input = 0; 
    if(node->redirect.mode == 2){ 
     input = 1; // > 
    } else{ 
     input = 0; // < 
    } 
    int pid = 0; 
    int *status = 0; 
    char * filename = node->redirect.target; // filename 
    int fd; 
    fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC); 
    if((pid = fork()) == 0){ 
     dup2(fd, input); // STDIN OR STDOUT 
     close(fd); 
     node_t* node2 = node->redirect.child; 
     execvp(node2->command.program, node2->command.argv); // execute program 
     printf("failed to execvp\n"); 
     exit(1);   
    } else { 
     wait(status); 
    } 
} 

我是新來的fork()但我的問題是我在做什麼錯在這裏是重定向標準輸出的作品,但標準輸入寫入沒什麼指定的文件。

+1

由於filedescriptor被打開'O_WRONLY | O_CREAT | O_TRUNC',子進程無法從中讀取任何數據。在標準輸入重定向的情況下,您需要打開它'O_RDONLY'。 – Ctx

+0

@Ctx我用'O_RDONLY'替換了'O_WRONLY',但它沒有效果。但爲什麼它應該準備好任何數據,因爲我需要寫入stdin呢? –

+1

重定向進程的stdin通常意味着給它一個filedescriptor來讀取_read_(這僅僅是一個約定,從技術上講它當然也可以寫入stdin)。 – Ctx

回答

1

正如評論中所述,您需要使用不同的打開選項,具體取決於您是打開文件以進行輸入還是輸出重定向。你可以把它放到你的if

int flags; 
if(node->redirect.mode == 2){ 
    input = 1; // > 
    flags = O_WRONLY | O_CREAT | O_TRUNC; 
} else{ 
    input = 0; // < 
    flags = O_RDONLY; 
} 
int pid = 0; 
int *status = 0; 
char * filename = node->redirect.target; // filename 
int fd; 
fd = open(filename, flags, 0666); 

此外,您需要指定創建輸出文件的情況下的權限模式。可以隨時指定此參數,當O_CREAT不在標誌中時,它將被忽略。

+0

它工作感謝您的答案。這個問題原來是「如何正確打開文件描述符」。 –