2013-02-10 3 views
1

У меня возникли проблемы с этой командой execve. Я могу использовать его для запуска большинства других команд, которые очень хороши в моей программе, но если я попытаюсь сделать что-то вроде man ls или что-то получу эту ошибку.Ошибка при вызове execve (man, args, env)

man: can't execute pager: No such file or directory 
man: command exited with status 255: LESS=-ix8RmPm Manual page ls(1) ?ltline  %lt?L/%L.:byte %bB?s/%s..?e (END):?pB %pB\%.. (press h for help or q to quit)$PM Manual page ls(1) ?ltline %lt?L/%L.:byte %bB?s/%s..?e (END):?pB %pB\%.. (press h for help or q to quit)$ MAN_PN=ls(1) pager -s 

Вот как я звоню его:

execve(cmdPath, args, env); 

где cmdPath это путь (в данном случае /usr/bin/man) args является char* где args[0] = man, args[1] = ls env мой env*[] передается от главный.

Любая помощь будет высоко оценена. Я умираю здесь.

+0

Вы можете запустить 'человек ls' правильно с одной и той же оболочки, которую вы используете для запуска вашей программы? – us2012

+0

да просто отлично. –

+1

Не могли бы вы попробовать с 'args [0] = ls' – Ganesh

ответ

3

Null прекратить аргументы, которые вы передаете execve. Что-то вроде

char *args[3]; 
// other args.. 
args[2] = (char*) 0; 

Это неопределенное поведение в противном случае возможно, поэтому он работал иногда в прошлом, и на этот раз вам не повезло.

Это работает:

int main(int argc, char *argv[], char *env[]) 
{ 
    char *args[3]; 

    args[0] = "man"; 
    args[1] = "ls"; 
    args[2] = (char*) 0; 

    execve("/usr/bin/man", args, env); 
} 
+0

хорошо это работает, только если я установил свой env [0] = NULL. - и даже тогда это дает мне предупреждение, что терминал не ведет себя прямо, пока не увижу страницу руководства. Тем не менее, я заметил, что мой env [] не такой, как если бы я просто вводил env в приглашении. Поэтому, если я смотрю на свою переменную PATH, обычно у меня есть 8 разных путей. Но в моей программе c, если я печатаю переменные env, существует только один PATH. –

+0

oh boy. Я нашел ошибку. Я просто вошел и закодировал env [15], чтобы быть строкой «PATH =/usr/bin: ........». Все, что getenv («PATH») дает мне и все работает отлично. Но почему мой env [15] отличается от моего getenv («PATH») для начала? Я так растерялся. –