C — Execv — несовместимый тип указателя

#c #unix

Вопрос:

Поэтому я пытаюсь отправить простую команду ping через Execv и распечатать на терминале.

У меня есть исходная проблема с массивом строк неизвестных аргументов. a[n][50], который будет заполняться на протяжении всего выполнения процесса в соответствии с вводом пользователем. Я не могу использовать «execv» , я продолжаю получать «несовместимый тип указателя». Пытаясь проиллюстрировать проблему, я сделал только простой «пинг» «google.com»

 int main(int argc, char const *argv[])
{

    //That's what I have...
    char a[3][50];
    strcpy(a[0], "ping");
    strcpy(a[1], "google.com");
    
    //First try
    a[2] = NULL;
    execv(a[0], a);    
    
    //Second time, trying to fix, also didnt work 
    char *pointer[3];
    pointer[0] = a[0];
    pointer[1] = a[1];
    pointer[2] = NULL;

    execv(pointer[0], pointer);

    return 0;
}
 

Есть ли какой-либо обходной путь без необходимости изменять формат a[n][50] для сохранения строк?

Комментарии:

1. 2-мерный массив-это не то же самое, что массив указателей.

2. a[2] = NULL; является недействительным. a[2] является массивом, который вы не можете назначить массиву.

3. Используйте execvp() , потому что вам нужно найти ping в $PATH

4. Или измените a[0] , чтобы это был полный путь к ping программе.

5. Для дальнейшего использования поставьте a perror("execv failed"); после execv , чтобы получить некоторую обратную связь при сбое вызова exec.

Ответ №1:

Вторая версия будет работать, но вам нужно использовать execvp() вместо execv , так как первый аргумент не является полным путем ping программы.