2016-12-23 8 views
2

Я пытаюсь реализовать команду cat, вызывая функцию exec() и сохраняя ее вывод в файле tmp. Моя проблема в том, что я знаю, что после вызова exec() что-нибудь потом будет игнорироваться, поэтому нет точки цикла для exec().Как выполнить exec() в цикле for? in C

Если у меня есть N аргументов для передачи в основную программу, как я могу выполнить цикл exec(), чтобы прочитать все аргументы?

Примечание: Использование системы() не является для меня выбором, вот как это задание.

Сейчас у меня есть следующий код в не очень изящным способом:

#include <unistd.h> 
#include <stdio.h> 
#include <string.h> 
#include <fcntl.h> 
#include <stdlib.h> 
#include <time.h> 
#include <errno.h> 
#include <sys/stat.h> 
#include <sys/times.h> 
#include <sys/wait.h> 

int main(int argc,char *argv[]) 
{ 
    int fd; 
    char filename[] = "tmp.txt"; 

    fd = open(filename, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR); 
    dup2(fd, 1); // make stdout go to file 
    dup2(fd, 2); // make stderr go to file     
    close(fd); 

    execl("/bin/cat", argv[0], argv[1], argv[2], argv[3], NULL); 

    return(0); 
} 
+0

вы имеете в виду пройти, не разобрать, верно? –

+1

И 'execv()' должен делать именно то, что вы хотите. https://linux.die.net/man/3/execv –

+0

@MarkYisri, вы правы, мои орфографические ошибки. – krm

ответ

4

Вы ищете execv (стандартной библиотечной функции):

int execv(const char *path, char *const argv[]); 

Который будет принимать ARGV. Для стандартного соответствия удостоверьтесь, что argv[0] == path.

Итак, вот ваш код, переписано:

int main(int argc,char *argv[]) 
{ 
    int fd; 
    char filename[] = "tmp.txt"; 

    fd = open(filename, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR); 
    dup2(fd, 1); // make stdout go to file 
    dup2(fd, 2); // make stderr go to file     
    close(fd); 
    execv("/bin/cat", (char *[]) { "/bin/cat", NULL }); 
    return(0); 
} 
+0

BINGO !!!! Спасибо!!! – krm