выполнять команды с опциями в программе переменного тока - PullRequest
0 голосов
/ 11 апреля 2011

Я пытаюсь выполнить командир с аргументами в программе переменного тока.Например, когда пользователь выполняет мою программу с помощью: "./a.out ls -la"

Программа должна выполнить ls с параметрами la.

Но я не знаю, каксделать это.

Моя программа использует форк.

Я пытаюсь так:

pid = fork();

if(pid == 0){

execvp(argv[1], &argv[2]);

}else{

wait(NULL);

}

Но это не работает.

Я хочупередать в качестве второго аргумента execvp массив с аргументами, передаваемыми в команде, но я немного запутался с указателями (и так далее с указателями указателей: s).

Я знаю, это не сработаетиз-за черты в аргументах, но даже если я не использую черту, программа запускает только 'ls', не заботясь о параметрах 'la'.

Если кто-то может мне помочь, я буду счастливзнать, как это сделать.

Спасибо.

Ответы [ 2 ]

1 голос
/ 11 апреля 2011

system

Quoth Wikipedia:

В стандартной библиотеке C система - это функция, используемая для выполнения подпроцессов и команд. Это определено в заголовке stdlib.h. Он отличается от семейства функций exec / spawn тем, что вместо передачи аргументов исполняемому объекту в системную оболочку передается одна строка, обычно это оболочка POSIX, / bin / sh -c.

http://en.wikipedia.org/wiki/System_(C_standard_library)

0 голосов
/ 11 апреля 2011

Несколько проблем здесь.

  1. вы не обрабатываете случай, когда fork() терпит неудачу.

  2. вы не обрабатываете случай, когда execvp() терпит неудачу. Если вы напечатаете strerror(errno), это может дать вам понять, почему ваш exec не работает.

  3. execvp () принимает массив char* const, который должен иметь NULL в качестве последнего элемента. Также первым элементом должно быть название программы. Это соглашение, но оно означает, что в вашем примере аргументы отключены на один. то есть ls считает, что он был вызван командой -la и без аргументов. Я не уверен, что argv[] гарантированно будет иметь указатель NULL после конца, поэтому не используйте его напрямую. например,

    char* args[3];
    args[0] = argv[1]; // You have already checked argc is at least three right?
    args[1] = argv[2];
    args[2] = NULL;
    // do your fork and error check then in the child
    
    int result = execvp(argv[1], args);
    // if you get here exec failed, handle as appropriate
    
  4. Вам необходимо проверить значение выхода wait(), и вы должны передать допустимый указатель int, чтобы вы могли диагностировать любые проблемы.

...