Запуск csh изнутри C - PullRequest
       6

Запуск csh изнутри C

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

Я хочу запустить из моей программы на С команду csh.Я сделал это, используя следующий код:

char *csh_command[3];
...
csh_command[2]=(char*)malloc((length_command+strlen("\"\""))*sizeof(char));

csh_command[0]=(char*)malloc((strlen("-f")+1)*sizeof(char));
csh_command[1]=(char*)malloc((strlen("-c")+1)*sizeof(char));

strcat (csh_command[0],"-f");
strcat (csh_command[1],"-c");
strcat (csh_command[2],"\"");
strcat (csh_command[2],full_command);
strcat (csh_command[2],"\"");
pid=fork();
if (pid == 0){
        execvp("csh", csh_command);
}

, что я делаю здесь, создаю массив, содержащий параметры для csh: -f, -c, "[команда для запуска]"

Но результат не тот, который ожидался.Дочерний процесс просто работает в фоновом режиме, ничего не делая.

Мы пытались запустить ls | wc -l, используя его.

в чем проблема?

РЕДАКТИРОВАТЬ:

Переменная length_command уже имеет +1 для \0.Проблема была с массивом, не оканчивающимся на NULL" были не нужны.

Ответы [ 3 ]

3 голосов
/ 15 апреля 2011

Первая ошибка. Я вижу, что

Массив указателей должен заканчиваться указателем NULL.

Попробуйте:

char *csh_command[4];
csh_command[3] = 0;

И что такое значение length_command?должно быть не менее strlen(full_command)+1

ОБНОВЛЕНИЕ:

Другая проблема может быть связана с strcat, поскольку вы используете неинициализированные строки и они могут содержать некоторыемусор.Выполните как минимум следующее:

char *str = (char *)malloc(strlen("blabla")+1);
str[0] = '\0';
strcat(str, "blabla");

Или просто используйте strdup вместо malloc + strcat

2 голосов
/ 15 апреля 2011

Несколько проблем, которые делают ваш код более сложным и неправильным, чем это должно быть:

  • malloc() + strcat() = strdup()

  • Если вы не планируете использовать общую функцию cshcmd() или что-то еще, почему вы копируете строковые литералы вместо их непосредственного использования?

  • Массив аргументов execvp() должен заканчиваться NULL.

  • Инициализаторы массивов и анонимные массивы являются благословением в подобных случаях - вы, вероятно, не пропустите NULL в конце с ними. Если, конечно, вам не придется использовать полностью динамические структуры ...

  • У вас не должно быть лишних двойных кавычек в аргументе команды. Они предназначены для работающей оболочки при использовании командной строки и удаляются при вызове exec(). Другими словами, csh должно видеть ls -1 | wc -l, а не "ls -1 | wc -l".

  • О, и первый элемент массива аргументов в exec() всегда равен argv[0]. Это должно быть что-то вроде csh, а не вариант.

EDIT:

  • Еще одна вещь: вы очищаете память, выделенную на malloc() перед использованием strcat()? strcat() будет радостно переполнять ваш буфер, в зависимости от того, какое случайное содержимое у него уже есть ...
1 голос
/ 15 апреля 2011

Первая проблема заключается в том, что в вашем malloc произошла ошибка «один за другим» - нет места для завершающего нуля (`\ 0 ')

length_command + strlen("\"\"") + 1

Второй выпуск с execvp:

Массив указателей должен заканчиваться указателем NULL.

Кроме того, execvp() использует оболочку и ищет ваш путь для данной команды. Первый аргумент, где у вас есть "csh", это исполняемый файл, который вы хотите запустить. Вы говорите о желании бежать wc; это будет первый аргумент.

...