grep не работает в пользовательской оболочке
Я пытаюсь написать оболочку на c, и она в основном работает, за исключением grep. Всякий раз, когда я даю команду grep в оболочке, она просто ничего не выводит. Вот часть кода, которую я использую, чтобы создать новый дочерний процесс и затем запустить в нем execvp().
Файловые дескрипторы (fd_in и fd_out) в dup2 передаются в качестве аргументов функции, имеющей этот код. И что самое интересное, когда я даю 'grep' или 'grep --help', он отображается как обычно. Я что-то пропустил? Или что-то особенное должно быть сделано с grep?
Вот что происходит с моей оболочкой: последняя команда выводится при запуске из bash.
--> grep
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.
--> wc /etc/hosts
11 33 314 /etc/hosts
--> grep -i "perror" shell.c
-->
Вот код:
void
create_process(char *cmd_argv[], int fd_in, int fd_out, char *buffer_copy) {
/*Flag bit for Background processes*/
int FLAG = 0;
pid_t cpid;
int status;
int i = 0,j = 0;
/*Find the no. of arguments*/
while(cmd_argv[j] != NULL)
j++;
/*Set the flag bit*/
if(strcmp("&", cmd_argv[j-1]) == 0) {
FLAG = 1;
cmd_argv[j-1] = NULL;
}
//Create a child process
cpid = fork();
if (cpid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
//In the child...
if (cpid == 0) {
/*Checking if the file descriptors are already assigned*/
/*For stdin*/
if (fd_in != STDIN_FILENO) {
dup2(fd_in, STDIN_FILENO);
close(fd_in);
}
/*For stdout*/
if (fd_out != STDOUT_FILENO) {
dup2(fd_out, STDOUT_FILENO);
close(fd_out);
}
/*Run the cmd specified*/
status = execvp(cmd_argv[0], cmd_argv);
/*In case of errors*/
if(status < 0) {
perror("execvp ");
exit(1);
}
}
//In the parent...
else {
if(FLAG == 1) {
/*Find where the new bg process can be inserted*/
while(1) {
if (bgprocess[i].pid == 0) {
bgprocess[i].pid = cpid;
strcpy(bgprocess[i].cmd, buffer_copy);
break;
}
i++;
}
printf("[%d] : %s\n", cpid, cmd_argv[0] );
}
/*If not bg, wait for the process to exit*/
else
waitpid(cpid, NULL, 0);
}
}
2 ответа
Проблема заключается в использовании кавычек в вашей оболочке. Баш делает много вещей в фоновом режиме. grep -i perror shell.c должен выдавать вывод вашей оболочки независимо от того, что ожидается при запуске из bash.
Quoth man dup2
:
После успешного возврата из одного из этих системных вызовов старые и новые файловые дескрипторы могут использоваться взаимозаменяемо. Они ссылаются на одно и то же описание открытого файла (см. Open(2))…
Поэтому после вашего звонка на dup2 (который вы должны проверить на наличие ошибок) вы закрываете oldfd
а также newfd
потому что они точно такой же дескриптор.
Я не могу понять, почему grep --help
работает вообще, но вы не показываете достаточно кода, чтобы ответить на этот вопрос.
Добавлен следующий комментарий: Вы все еще не даете достаточно кода. Если grep
не работает, чем то, что есть? Есть ли wc /etc/hosts
Работа? В grep нет ничего особенного, на самом деле это совершенно нестандартный фильтр Unix.