Выполнение параметра команды Exec () - PullRequest
0 голосов
/ 20 октября 2019

Я студент-разработчик и новичок в языке программирования Си. У меня есть задача, и я не нашел четкого решения в соответствии с моим уровнем. Я хочу запустить функцию exec () в дочернем процессе. Я создал parent и child с помощью fork (). Все нормально. Но мой код запускает только команды типа ls , pwd и т. Д. Если я хочу написать ls -l, команда не работает подобным образом. Что я должен делать ? Не могли бы вы помочь мне в этом вопросе?

Мой вывод для ls:

ls
a.out main.c
2006152 мс

Мой вывод для ls -l:

ls -l
Ошибка exec: Нет такого файла или каталога
3627824 мс

Мой кодэто:

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>

#define N 100

void ChildProcess  ();  
void ParentProcess ();  

struct timeval start, end;

int main () {


    gettimeofday (&start, NULL);

    pid_t pid;
    pid = fork ();

    if (pid == 0){
        ChildProcess ();
    }
    else {
        wait (NULL);
        ParentProcess ();
    }

return 0;
}

void ChildProcess () {
    char input[N];
    scanf (" %[^\n]s", input);

    if (execlp (input, "", (char *) 0) < 0){
    perror ("Error exec");
    exit (0);}
} 

void ParentProcess () {
    gettimeofday (&end, NULL);
    printf ("%ld %s \n", ((end.tv_sec * 1000000 + end.tv_usec)-(start.tv_sec * 1000000 + start.tv_usec)), "ms");
} 

1 Ответ

2 голосов
/ 20 октября 2019

Ваша проблема в том, что все функции семейства exec() ожидают только имени исполняемого файла в качестве первого параметра (без каких-либо аргументов). Затем аргументы передаются в соответствии с функцией exec, которую вы решили вызвать. В случае execlp() все аргументы (включая имя исполняемого файла) передаются в виде списка с нулевым символом в конце.

По сути, вы хотите вызвать свою функцию следующим образом:

execlp ("ls", "ls", "-l", (char *) 0);

Способ сделать это - разделить строку input на символ пробела (используя strtok()) и сохранить результаты в различных переменных.

Если вы хотите обработать случаи множественногоаргументы, то вы не можете достичь этого с помощью execlp(). Вместо этого используйте execvp() с соответствующими изменениями. Вы можете найти справочную страницу для всех exec() функций здесь , которая даст вам достаточно информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...