2015-03-31 1 views
0

Я хочу перенаправить stdout и stdin в определенный файл, который будет указан в массиве argv.Как перенаправить stdout и stdin в заданный файл с помощью argv в C

Например, когда я вхожу в команду, как - ./shell Ls> Тест

он должен быть перенаправлен в файл «тест», теперь я немного путаю, потому что без написания кода автоматически перенаправляет на этот файл , Я хочу сделать это вручную, во-вторых, когда я вхожу в команду like- ./shell ls < test, stdin следует перенаправить. Я попытался найти имя файла и знак «>» или «<», используя argv [argc-1] и argv [argc-2], но кажется, что когда я использую «>» и имя файла впоследствии, вывод печатает (аргументы перед «>» «<» в этом файле вместо того, чтобы получать это имя и знак.

В принципе, я создаю команду оболочки с помощью execvp() и fork().

Вот мой код, я могу перенаправить stdout в статическом файле.

void call_system(char *argv[],int argc) 
    { 
    int pid; 
    int status=0; 
    signal(SIGCHLD, SIG_IGN); 
    int background; 
    /*two process are created*/ 
    pid=fork(); 
    background = 0; 

    if(pid<0) 
    { 
     fprintf(stderr,"unsuccessful fork /n"); 
     exit(EXIT_SUCCESS); 
    } 
    else if(pid==0) 
    { 
     //system(argv[1]); 
     /*argument will be executed*/ 

       freopen("CON","w",stdout); 
        char *bname; 
        char *path2 = strdup(*argv); 
        bname = basename(path2); 


         execvp(bname, argv); 
         fclose (stdout); 
    } 
    else if(pid>0) 
    { 
    /*it will wait untill the child process doesn't finish*/ 
    //waitpid(pid,&status,0); 

    wait(&status); 

    //int tempid; 
    //tempid=waitpid(pid,&status,WNOHANG); 
    //while(tempid!= pid);// no blocking wait 


    if(!WIFEXITED(status) || WEXITSTATUS(status)) 
    printf("error"); 



         exit(EXIT_SUCCESS); 

    } 
    } 
+0

Просто используйте что-то другое, кроме '>' и '<', например './myprog -i input.file -o output.file'. –

ответ

0

stdio redirection обрабатывается оболочкой, а не запущенной программой. Соответствующими системными вызовами являются pipe, open и dup2, а второй из них используется для перенаправления stdio filedescriptors в канал или файл, для чтения или записи.

1

Попробуйте использовать dup() или dup2() или dup3().

Системный вызов dup() создает копию файлового дескриптора oldfd, , используя неиспользуемый дескриптор наименьшего номера для нового дескриптора.

File *fp=fopen(argv[1],"r"); 
int fd=fileno(fp); 

dup2(fd,0); //dup2(fd,STDIN_FILENO) redirect file stream to input stream 
scanf("%s",buff); //reading from file. 

Точно так же выход может быть redirected.From руководство эти сведения могут быть полезны

On program startup, the integer file descriptors associated with the 
     streams stdin, stdout, and stderr are 0, 1, and 2, respectively. The 
     preprocessor symbols STDIN_FILENO, STDOUT_FILENO, and STDERR_FILENO 
     are defined with these values in <unistd.h>. 

Предположим, что вы хотите, чтобы перенаправить стандартный вывод в этот файл.

dup2(fd,1);//dup2(fd,STDOUT_FILENO) 
printf("%s",buff); //this will write it to the file.