2014-12-24 2 views
0

Привет всем, я новичок в системном программировании, пожалуйста, подумайте, если мои сомнения очень расплывчаты.Системный вызов execvp не выполняется

Я на самом деле следую книге под названием Linux System Programming, и я сомневаюсь в системном вызове execvp(). Как указано в примере с книгой, я попробовал ее на своей машине, и вот следующий пример.

#include<unistd.h> 

//int ret; 
int main(){ 

const char *args[] = { "vi", "/home/kidd/hooks.txt", NULL }; 
int ret; 
ret = execv ("/bin/vi", args); 
if (ret == −1) 
perror ("execvp"); 

} 

И я получаю ошибку foolwing:

error: invalid conversion from ‘const char**’ to ‘char* const*’ [-fpermissive] 

Я дал константный символьные массивы имя, которое, очевидно, Const символ **.

Почему это дает эту ошибку? **

ответ

0

Массив арг не должен иметь тип Const символ *, это должно быть просто символ * (таким же образом, что ARGV аргумент основной просто символ *). Так что ваш код должен выглядеть следующим образом:

#include <unistd.h> 

int main() { 
char *args[] = { "vi", "/home/kidd/hooks.txt", NULL }; 
int ret; 
ret = execv ("/bin/vi", args); 
if (ret == -1) 
    perror ("execvp"); 
} 
+0

Но я понимаю didnot аргумент типа logic.The должен быть константной символ ** как же строковые литералы внутри влияют на type.I'm C++ программист против меня, если ошибки , –

+0

Тип, который вы хотите, это const * char *. Поскольку литералы имеют тип const char *, объявление типа массива const char * дает вам тип const char **. Поэтому вместо этого вы создаете массив char * для получения типа const * char *. http://linux.die.net/man/3/execvp http://stackoverflow.com/questions/12517983/c-what-is-the-datatype-of-string-literal – imareaver

Смежные вопросы