Передача ›› в качестве аргумента execv?

Я пытаюсь передать некоторые аргументы в вызов execv:

char *const paramList[] = {"/bin/grep", "-rn", "comrade", 
                           "/home/sgspectra/Documents/testing_grep/",
                           ">>", "output.txt", NULL};

Я считаю, что ">>" и "output.txt" читаются как аргументы для дополнительных каталогов для поиска, а не для отправки вывода в "output.txt". Можно ли отправить аргумент, который указывал бы, что только предыдущий аргумент является каталогом?


person sgspectra    schedule 24.09.2018    source источник
comment
>> - это оболочка. Для execxxx() оболочка не задействована.   -  person wildplasser    schedule 25.09.2018
comment
Функция exec не выполняет перенаправление. Вам нужно открыть output.txt в режиме добавления, а затем использовать dup2 для замены стандартного дескриптора выходного файла. И это должно произойти до того, как вы позвоните exec.   -  person user3386109    schedule 25.09.2018


Ответы (1)


Когда вы вводите команду в оболочку, поддерживающую >>, оболочка сама обрабатывает «>> filename’ в вашей команде. Затем он удаляет этот текст из командной строки. Остальная часть командной строки (части, которые не были удалены, включая вашу команду и любые другие аргументы) затем передается execv или одной из связанных с ней функций.

Чтобы сделать то же самое, вам нужно сделать что-то вроде:

  • Вызовите fork, чтобы создать подпроцесс вашего процесса.
  • В родительском элементе (где fork возвращает идентификатор процесса для созданного им дочернего процесса) продолжите другое выполнение - родительский элемент может ждать дочернего процесса или может продолжить выполнение других действий.
  • В дочернем (где fork возвращает 0) закройте файловый дескриптор 1 (стандартный вывод) и используйте openat, чтобы открыть output.txt в режиме добавления в файловый дескриптор 1. Затем вызовите execv.

(Caveat emptor: прошло несколько десятилетий с тех пор, как я делал подобные вещи, поэтому моя память, возможно, изменилась, и точные необходимые шаги могли измениться.)

Более грубый, но простой для кодирования вариант - использовать execv для выполнения оболочки, в которую вы передаете параметры, запрашивающие интерпретацию и выполнение вашей команды, включая перенаправление, как показано в этот ответ.

person Eric Postpischil    schedule 25.09.2018
comment
Спасибо за ваш ответ! Мне удалось использовать popen (), чтобы в итоге получить желаемый результат. fp = popen("/bin/grep -rn comrade . >> output.txt","r"); - person sgspectra; 26.09.2018