2014-01-30 106 views
0

我的代碼被粘貼在下面。dup2()阻止輸出

我正在嘗試使用dup2將我的輸出重定向到文件。

如果我用它來重定向它工作正常(如果我刪除評論),輸出在文件中,而不是在標準輸出。例如:ls>測試,導致ls輸出測試。

問題是ls,沒有>不輸出任何東西。如果我儘可能地離開評論輸出,儘管沒有重定向的能力。

重定向[0]是要麼<或>有或全無 重定向[1]該文件的路徑重定向到

命令是與所述命令的命令的PICES cstrings的陣列是以及

例如輸出 與代碼註釋

[email protected]:/home/majors/kingacev/ubuntumap/cop4610/proj1> ls 
a.out myshell.c myshell.c~ 
[email protected]:/home/majors/kingacev/ubuntumap/cop4610/proj1> 

與代碼未註釋

[email protected]:/home/majors/kingacev/ubuntumap/cop4610/proj1> ls 
[email protected]:/home/majors/kingacev/ubuntumap/cop4610/proj1> 


    /* 
    if (!strcmp(redirect[0],">")){ 
    if ((fd = open(redirect[1], O_RDWR | O_CREAT)) != -1) 
     dup2(fd, STDOUT_FILENO); 
    close(fd); 
    } 
    */ 

    if (command[0][0] == '/'){ 
    int c = execv(command[0], commands); 
    if (c != 0){ 
     printf("ERROR: command does not exist at path specified\n"); 
     exit(0); 
    } 
    } 
    else if (!execv(path, commands)){ 
    exit(0); 
    } 
+0

什麼是「重定向」,它是如何聲明的? –

+0

char *重定向[2]; [0]具有>或<或notheing,並且[1]具有文件的路徑 – d0m1n1c

+0

哦,並且您是否嘗試用調試程序逐步執行代碼? –

回答

0

此代碼的工作,重定向到file.out

#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 
#include <fcntl.h> 

int main(void) 
{ 
    int fd; 
    char *redirect[] = { ">", "file.out" }; 
    char *command[] = { "/bin/ls", "-l", 0 }; 

    if (!strcmp(redirect[0], ">")) 
    { 
     if ((fd = open(redirect[1], O_WRONLY | O_CREAT, 0644)) != -1) 
     { 
      fprintf(stderr, "Dupping stdout to %s\n", redirect[1]); 
      dup2(fd, STDOUT_FILENO); 
      close(fd); 
     } 
    } 

    if (command[0][0] == '/') 
    { 
     execv(command[0], command); 
     fprintf(stderr, "ERROR: command %s does not exist at path specified\n", command[0]); 
     return(1); 
    } 
    else 
    { 
     fprintf(stderr, "ERROR: not handling relative names like %s\n", command[0]); 
     return(1); 
    } 
    return 0; 
} 

此代碼的工作也沒有進行重定向到文件:

#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 
#include <fcntl.h> 

int main(void) 
{ 
    int fd; 
    char *redirect[] = { "<", "file.in" }; 
    char *command[] = { "/bin/ls", "-l", 0 }; 

    if (!strcmp(redirect[0], ">")) 
    { 
     if ((fd = open(redirect[1], O_WRONLY | O_CREAT, 0644)) != -1) 
     { 
      fprintf(stderr, "Dupping stdout to %s\n", redirect[1]); 
      dup2(fd, STDOUT_FILENO); 
      close(fd); 
     } 
    } 

    if (command[0][0] == '/') 
    { 
     execv(command[0], command); 
     fprintf(stderr, "ERROR: command %s does not exist at path specified\n", command[0]); 
     return(1); 
    } 
    else 
    { 
     fprintf(stderr, "ERROR: not handling relative names like %s\n", command[0]); 
     return(1); 
    } 
    return 0; 
} 

注意,它設置了command數組,並使用execv(command[0], command); - 這是推薦的做生意的方式。您的代碼似乎有一個變量commands,推測是程序的參數;你也似乎有一個變量path大概是該程序的路徑名稱。由於我們無法看到這些內容,因此很難知道它們包含什麼以及哪裏可能存在問題。請注意0​​陣列末尾的顯式空指針(0)。這是至關重要的。還要注意,錯誤消息指出了失敗的原因。有些東西比一個說「它出錯了」而沒有確定它是什麼的程序更令人沮喪。

+0

謝謝,open()中的0644是什麼? – d0m1n1c

+0

創建的文件的權限。當你在'O_CREAT'中使用'open()'時,它是一個帶3個參數的函數;否則,它只需要2個參數。第三個參數是在文件上設置的權限,它將由'umask'設置修改。模式0644是對所有者的讀/寫,對於組和其他人是隻讀的。有一些方法可以象徵性地寫出('S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH'),但坦率地說,我需要花費更長的時間來理解,而不是0644。 –

+0

如果您不介意,我可以向您發送一份我的整個解決方案的副本,我會在這裏發佈,但我認爲我的導師不會理解這一點。我仍然無法弄清楚爲什麼它的行爲如此。 – d0m1n1c