запустить программу в фоновом режиме с системным вызовом execvp в c

я пишу программу, которая получает имя команды и аргументы и, возможно, строку «bg» в конце, если строка «bg» передается, моя программа должна выполнить команду с ее аргументами в фоновом режиме, если не на переднем плане, вот мой код:

#include<sys/types.h>   
#include<sys/wait.h>    
#include<unistd.h>
#include<stdio.h>
#include<errno.h>
#include <stdlib.h>
#include <string.h>


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

pid_t pid;
int state;

if( (pid=fork())<0) {
    perror("\nError in fork");
    exit(-1);
} 
else if(pid==0) {  
    if(strcmp(argv[argc-1], "bg") == 0 ){
        strcpy(argv[argc-1],"&");
        if( (execvp(argv[1], argv)<0)) {
            perror("\nError in first execvp");
            exit(-1);
        }
    }
    else{
        if( (execvp(argv[1], argv+1)<0)) {
            perror("\nError en second el execvp");
            exit(-1);
        }
    }   

}    
wait(&state);
printf("\nMy child %d terminated with state %d\n",pid,state);

exit(0);

}

пример ввода:

./myprogram ls -lai bg   // in this case my program should execute "ls -lai" in background
./myprogram ls -lai      // in this case it should execute command normally in foreground 

мой код работает, когда аргумент bg не передается, но когда он был передан, я попытался заменить его на «&», но это не сработало, ребята, помощь приветствуется.


person Mustapha    schedule 26.12.2013    source источник
comment
Вы понимаете, что значит запускать программу в фоновом режиме?   -  person Ignacio Vazquez-Abrams    schedule 27.12.2013
comment
& не обрабатывается execvp(), он обрабатывается оболочкой, аналогично тому, как вы обрабатываете токен bg. Поскольку вы не используете оболочку для запуска команды, она не будет иметь никакого эффекта.   -  person Barmar    schedule 27.12.2013
comment
Если вы хотите запустить его в фоновом режиме, просто выйдите, не вызывая wait().   -  person Barmar    schedule 27.12.2013
comment
Прочитайте advancedlinuxprogramming.com   -  person Basile Starynkevitch    schedule 27.12.2013
comment
@ Игнасио Васкес-Абрамс, да, наверное, это домашнее задание.   -  person Mustapha    schedule 27.12.2013
comment
Вы так догадываетесь? Ваш код показывает обратное.   -  person Ignacio Vazquez-Abrams    schedule 27.12.2013


Ответы (1)


Разница между запуском программы в фоновом режиме или без него заключается в ожидании ее завершения или в том, чтобы не ждать. Таким образом, вам не нужно использовать два разных execvp. Но вам нужно удалить завершающий bg из аргументов. Добавление & ничего не даст — & является метасимволом для оболочки, который говорит оболочке не ждать выполнения программы, которая выполняется.

Итак, что вы должны сделать, это:

if the last argument is "bg" : decrease argc by one, set the argument that had the bg to null
fork and execvp what's in argv
if the last argument was "bg", do NOT call wait(); else call wait.
person Guntram Blohm    schedule 26.12.2013