2015-12-02 2 views
1

Так что у меня есть проблема, которую я не смог решить. Я пишу программу C, которая выполняет некоторые функции ОС через каналы. Выполнение выполняется с помощью execvp (const char * file, char * const argv []) ;.От argv до execvp

В моей основной функции я хотел бы взять всю строку, переданную программе (argv), за исключением первого char-массива и передать ее grep. Все работает в данный момент, но я продолжаю получать предупреждение:

Мой код выглядит следующим образом. В разделе if(1 < argc) я хочу, чтобы иметь возможность отправить argv с первым сообщением, измененным до newPipeline в том же формате, что и printenv, сортировать и меньше.

int main(int argc, char** argv, char **envp){ 

    const char* printenv[] = {"printenv", NULL, NULL}; 
    const char* sort[] = {"sort", NULL, NULL}; 
    const char* less[] = {"less", NULL, NULL}; 
    if(1<argc){ 
     argv[0] = "grep"; 
     const char* grep = argv; 
     const char* const* commands[] = {printenv, sort, grep, less, NULL}; 
     newPipeline((char* const**)commands, 0, STDIN_FILENO); 
    } 
    //FROM HERE ON IT WORKS 
    else{ 
     const char* const* commands[] = {printenv, sort, less, NULL}; 
     newPipeline((char* const**)commands, 0, STDIN_FILENO); 
    } 
    if(signal(SIGCHLD, SIG_IGN) == SIG_ERR){ 
     perror("A problem with the children"); 
    } 
    exit(0); 
} 

Я знаю, что типы указателей ошибочны. Должен ли я создать совершенно новый массив для grep, или должен ли я, как я пытаюсь сделать сейчас, направить указатели на нужный указатель. Если позже, какие указатели это будут?

+1

Вы должны скопировать массив (argv) в другой, чтобы работать с –

+1

'argv' не' const'. Вы можете изменять его по своему усмотрению (и так будет 'grep'), поэтому делайте копию каждый раз, когда вы ее передаете. –

+0

вы хотите присоединиться к элементам argv в одну строку, разделенную пробелом, правильно? вот что вам не хватает в этом случае – someguy

ответ

2

Ваша переменная grep должна быть указателем на массив строк или массив строк (а не просто строку).

Что-то вроде:

argv[0] = "grep"; 
const char** grep = (const char**)argv; //make grep point to the modified char** argv; 

должен это сделать, или построить новый массив:

const char* grep[argc+1]; 
grep[0] = "grep"; 
grep[argc]=NULL; 
for(int i=1; i<argc; i++){ 
    grep[i] = argv[i]; 
} 

Кстати, я считаю, нужно только один NULL в конце каждой строки массива.

1

Проблема заключается здесь

const char* grep = argv; 

C не обеспечивает внутренний кастинг типа для константных типов. И если ваш мотив состоит в том, чтобы скопировать массив argv в grep, это неправильно, используйте strcpy или любую такую ​​функцию, чтобы сделать клон этого массива.

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