Как использовать execv для grep? - PullRequest
0 голосов
/ 23 марта 2020

Мой grep находится в / bin / usr / grep. Мой дочерний процесс выполняется, но он не выполняет команду execv. Я ищу слово "include" в моем файле "Ques29. c", который показан ниже:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

int main()
{
    pid_t pid;
    pid = fork();
    if (pid < 0)
        perror("Failed to fork.");
    else if (pid == 0)
    {
        char *argv[] = { "-n", "include", "ques29.c", "NULL" };
        execv("/usr/bin/grep", argv); 
    }
    else
    {
        int status;
        waitpid(pid, &status, 0);
        if (WIFEXITED(status))
        {
            int exit_status = WEXITSTATUS(status);
            printf("Parent: Process ID %ld Exit status of the child was %d\n", (long)getpid, exit_status);
        }
    }
    return 0;
}   

Вывод

Parent: Process ID 140735031147632 Exit status of the child was 0

Ответы [ 2 ]

3 голосов
/ 23 марта 2020

Per execv() Linux man-страница :

v - execv (), execvp (), execvpe ()

Char * const argv [] аргумент - это массив указателей на строки с нулевым символом в конце, которые представляют список аргументов, доступный для новой программы. Первый аргумент, по соглашению, должен указывать на имя файла, связанное с исполняемым файлом. Массив указателей должен заканчиваться нулевым указателем.

Вам необходимо изменить

    char *argv[] = { "-n", "include", "ques29.c", "NULL" };
    execv("/usr/bin/grep", argv); 

на

    char *argv[] = { "/usr/bin/grep", "-n", "include", "ques29.c", NULL };
    execv(argv[0], argv); 

И, как отмечено в комментариях обработка неудавшегося вызова на exec*(), вероятно, должна быть выполнена:

    execv(argv[0], argv); 

    // no need to check the return value as
    // a successful call won't return
    perror( "execv()" );

    // note that return and exit() can cause
    // problems with more complex code
    _exit( 255 );
1 голос
/ 23 марта 2020

Массив должен заканчиваться указателем NULL, но в вашем коде последний элемент является строковым литералом "NULL", а первый аргумент должен быть путем к исполняемому файлу:

Вместо это:

char *argv[] = { "-n", "include", "ques29.c", "NULL" };

Вы хотите это:

char *argv[] = {"/usr/bin/grep", "-n", "include", "ques29.c", NULL };
...