2015-03-11 4 views
1

Я пытаюсь сделать следующее:Execvp с тремя элементами

execvp(command[0][0], argument[0], '&'); 

Который работает, когда он не в фоновом режиме, то есть:

execvp(command[0][0], argument[0]); 

Нужно ли создать дополнительный массив для конкатенации символа & до конца argument, или есть ли другой способ вставить опцию фона в конце команды execvp?

+3

'&' не является аргументом, а анализируется оболочкой. – user4098326

+2

Для ясности, если вы делаете это для фонового режима, тогда '&' не является аргументом для программы. Его разбирает оболочка вашего (например, bash) и эквивалентна первому вызову 'fork()'. Возможно, посмотрите: http://www.cs.ecu.edu/karl/4630/sum01/example1.html –

ответ

0

Чтобы ответить на то, что вы просили:

Если вы хотите передать дополнительный аргумент, вам необходимо сцепить в массив. Это может означать создание нового массива. Консистент использует memcpy(), чтобы облегчить жизнь при копировании.

Но asnwer то, что вы ищете (работает в фоновом режиме)

Вы не можете сделать что-то в фоновом режиме с этим. execvp заменяет весь образ процесса командой (первый аргумент).

Пример взят из: http://www.cs.ecu.edu/karl/4630/sum01/example1.html

Если вы хотите, чтобы запустить что-то в фоновом режиме, вам нужно раскошелиться первым:

int runcmd(char *cmd) 
{ 
    char* argv[MAX_ARGS]; 
    pid_t child_pid; 
    int child_status; 

    parsecmd(cmd,argv); 
    child_pid = fork(); 
    if(child_pid == 0) { 
    /* This is done by the child process. */ 

    execvp(argv[0], argv); 

    /* If execvp returns, it must have failed. */ 

    printf("Unknown command\n"); 
    exit(0); 
    } 
    else { 
    /* This is run by the parent. Wait for the child 
     to terminate. If you want to run in the background then 
     you could remove this code. It's equivalent to "wait" 
     on the shell. */ 

    do { 
     pid_t tpid = wait(&child_status); 
     if(tpid != child_pid) process_terminated(tpid); 
    } while(tpid != child_pid); 

    return child_status; 
    } 
} 
0

execvp() функция ожидает ровно два аргумента, имя двоичного кода для выполнения и NULL - перечеркнутый массив указателей на аргументы команды. Передача большего количества аргументов приводит к неопределенному поведению. Передача аргументов типов, отличных от ожидаемых, может компилироваться, но, вероятно, не имеет желаемого результата.

Итак, если вы хотите взять существующий массив аргументов и добавить другой аргумент, вам нужно будет сделать копию с пространством для дополнительного элемента. Также обратите внимание, что '&' является литералом char, а не строковым литералом. Различие огромно.

С учетом всего сказанного, я наблюдаю, как и другие делали, что дает «&» в качестве аргумента программы будет не есть результат выполнения программы в фоновом режиме, и в более общем плане, что execvp() и другое Функции exec-family могут не иметь такого поведения, которое вы ожидаете. В частности, имейте в виду, что функции exec обычно не возвращаются. Обычно один из fork() s первый и выполняет exec в дочернем процессе, который по сути обеспечивает поведение фонового процесса.

В качестве альтернативы, возможно, вы найдете функцию system() более удобной, так как она использует оболочку для запуска указанной вами команды.

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