2012-08-13 40 views
0

我想在C程序中實現一個簡單的「cat file1> file1」命令。我曾嘗試以下,但它不工作...C程序中的I/O重定向

main() { 
    pid_t pid; 
    FILE *ip, *op; 
    char *args[3]; 
    printf("Name of the executable program\n\t"); 
    scanf("%s", &name[0]); // I entered cat here 
    printf("Name of the input file\n\t"); 
    scanf("%s", &name[1]); //file1.txt 
    printf("Name of the output file\n\t"); 
    scanf("%s", &name[0]); //file2.txt 
    pid = fork(); 
    if(pid == -1) 
     perror("fork() error"); 
    else if(pid > 0) 
     waitpid(-1, NULL, 0); 
    else if (pid == 0) { 
     op = fopen(name[2], "w"); 
     close(1); 
     dup(op); 
     execlp(name[0], name[1], NULL); 
     } 
    return 0; 
    }// end of main() 

我以爲execlp()將運行cat file1.txt,其輸出將被重定向到file2.txt,但它不是,我不知道爲什麼。我該怎麼做?

回答

1
scanf("%s", &name[0]); // I entered cat here 
printf("Name of the input file\n\t"); 
scanf("%s", &name[1]); //file1.txt 
printf("Name of the output file\n\t"); 
scanf("%s", &name[0]); //file2.txt 

顯然不是實際的代碼是C & P - nameargs,最後一個應該是「2」,而不是0

此外,在文件描述符DUP的作品,而不是文件*,所以需要看開放而不是fopen,或任何方法從文件獲取fd *

+0

確定後,是什麼在運行時我得到的是 狗屎:標準輸出:錯誤的文件描述符 – 2012-08-13 03:31:05

+0

更新答案 - 全部基於內存雖然,手指交叉,我記錯... – John3136 2012-08-13 03:33:29

+0

從文件流獲取文件描述符的函數是'fileno()'。不要忘記在'execlp()'之前''close()'或'fclose()'這個流是'dup()'d。 – 2012-08-13 05:08:09

0

您必須使用fork()進程並將其文件描述符重新分配給之前(手動)的open()'編輯文件,或使用system()調用使shell爲您處理它。

1

execlp()的第一個參數是要查找的名稱;第二個和以下參數是argv列表,從argv[0]開始。

int execlp(const char *file, const char *arg0, ... /*, (char *)0 */); 

對於外殼I/O重定向,它更容易打開的文件與open()比使用標準I/O(<stdio.h>FILE *);你也應該關閉你在dup()之後打開的文件,雖然它更容易使用dup2()。你需要分配空間來讀取字符串;在很多系統上,原始代碼會崩潰,因爲str中的指針不指向任何地方。通常情況下,只有在一切正常的情況下才能以狀態0退出。否則,以非零退出狀態退出。

這導致:

修改
#include <fcntl.h>  /* open() */ 
#include <stdio.h> 
#include <stdlib.h> 
#include <sys/wait.h> /* waitpid() */ 
#include <unistd.h>  /* execlp(), fork(), dup2() */ 

int main(void) 
{ 
    pid_t pid; 
    pid_t corpse; 
    int status; 
    char name[3][50]; 
    printf("Name of the executable program\n\t"); 
    if (scanf("%49s", name[0]) != 1) 
     return(EXIT_FAILURE); 
    printf("Name of the input file\n\t"); 
    if (scanf("%49s", name[1]) != 1) 
     return(EXIT_FAILURE); 
    printf("Name of the output file\n\t"); 
    if (scanf("%49s", name[2]) != 1) 
     return(EXIT_FAILURE); 
    pid = fork(); 
    if (pid == -1) 
    { 
     perror("fork() error"); 
     return(EXIT_FAILURE); 
    } 
    else if (pid > 0) 
     corpse = waitpid(-1, &status, 0); 
    else 
    { 
     int fd = open(name[2], O_WRONLY|O_CREAT|O_EXCL, 0644); 
     if (fd < 0) 
     { 
      fprintf(stderr, "Failed to open %s for writing\n", name[2]); 
      return(EXIT_FAILURE); 
     } 
     dup2(fd, 1); 
     close(fd); 
     execlp(name[0], name[0], name[1], NULL); 
     fprintf(stderr, "Failed to exec %s\n", name[0]); 
     return(EXIT_FAILURE); 
    } 
    return(corpse == pid && status == 0 ? EXIT_SUCCESS : EXIT_FAILURE); 
} 
+0

感謝兄弟......非常感謝........ – 2012-08-13 07:55:46