Я пытаюсь запустить команду "wc -l << END
" с помощью execvp, поэтому я разбираю команду и запускаю execvp с "wc -l
", но затем она переходит в бесконечный цикл.
Как мне заставить ее работать, чтобы она останавливалась, когда находит ключевое слово (в данном случае END)?
- я должен использовать execvp
- команда исходит от пользовательского ввода, который в данном случае "
wc -l << END
"
редактировать
Вот мой код (много не поможет, но может дать некоторую информацию) [код для здесь-документа находится в последнем операторе else]:
redirect(int proc, char * input){
char * comm;
int proc2;
int append = 0;
if(proc == 1){ //in
comm = strsep(&input, "<");
proc2 = check(input);
}
else{ //out
comm = strsep(&input, ">");
proc2 = check(input);
if(proc2 == 2){ //append
strsep(&input, ">");
append = 1;
}
}
if(proc2 == 0 || append == 1){ //only one redirection
if(proc == 1){ //in
input = trim(input);
int fd = open(input, O_RDWR);
close(0);
dup2(fd, 0);
close(fd);
comm = trim(comm);
char ** words = parse(comm);
if(!execvp(words[0], words)){ /*exec failed */
exit(1);
}
}
else{ //out
input = trim(input);
int fd;
if(append == 0){ //create
fd = open(input, O_CREAT | O_RDWR | O_TRUNC,
S_IRUSR | S_IWUSR);
}
else{ //append
fd = open(input, O_CREAT | O_RDWR | O_APPEND,
S_IRUSR | S_IWUSR);
}
dup2(fd, 1);
close(fd);
comm = trim(comm);
char ** words = parse(comm);
if(!execvp(words[0], words)){ /*exec failed */
exit(1);
}
}
}
else{ //more than one redirection/pipe
if(proc == proc2){ //here-doc
strsep(&input, "<");
input = trim(input);
}
}
}
Решением было бы сохранить ввод пользователя во временный файл, а затем передать временный файл как стандартный ввод, но я хотел знать, есть ли лучший способ сделать это.
execvp()
не использует оболочку для запуска программы, поэтому напрямую использовать функции оболочки не получится. Вместо этого вы можете запустить оболочку и передать ей соответствующие аргументы... - person Dmitri   schedule 10.12.2014exec()
в исходном процессе, а не в дочернем? Возможно, вам придетсяfork()
запустить команду в дочернем процессе и передать ему входные данные от родителя (который будет следить за маркером END). - person Dmitri   schedule 11.12.2014