grep не работает в пользовательской оболочке - PullRequest
0 голосов
/ 15 августа 2011

Я пытаюсь написать оболочку на 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 ]

0 голосов
/ 16 августа 2011

Проблема заключается в использовании кавычек в вашей оболочке. Баш делает много вещей в фоновом режиме. grep -i perror shell.c должен выдавать вывод вашей оболочки независимо от того, что ожидается при запуске из bash.

0 голосов
/ 15 августа 2011

Quoth man dup2:

После успешного возврата из одного из этих системных вызовов старые и новые файловые дескрипторы могут использоваться взаимозаменяемо.Они ссылаются на одно и то же описание открытого файла (см. Open (2))…

Поэтому после вашего вызова dup2 (который вы должны проверять на наличие ошибок) вы закрываете oldfd и newfd потому что они точно такой же дескриптор.

Я не могу понять, почему grep --help вообще работает, но вы не показываете достаточно кода, чтобы ответить на этот вопрос.

Добавлен следующий комментарий : Вы все еще не даете достаточно кода.Если grep не работает, чем что?wc /etc/hosts работает?В grep нет ничего особенного, на самом деле это совершенно нестандартный фильтр Unix.

...