Так что у меня есть проблема, которую я не смог решить. Я пишу программу 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
, или должен ли я, как я пытаюсь сделать сейчас, направить указатели на нужный указатель. Если позже, какие указатели это будут?
Вы должны скопировать массив (argv) в другой, чтобы работать с –
'argv' не' const'. Вы можете изменять его по своему усмотрению (и так будет 'grep'), поэтому делайте копию каждый раз, когда вы ее передаете. –
вы хотите присоединиться к элементам argv в одну строку, разделенную пробелом, правильно? вот что вам не хватает в этом случае – someguy