я пишу программу, которая получает имя команды и аргументы и, возможно, строку «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 не передается, но когда он был передан, я попытался заменить его на «&», но это не сработало, ребята, помощь приветствуется.
&
не обрабатываетсяexecvp()
, он обрабатывается оболочкой, аналогично тому, как вы обрабатываете токенbg
. Поскольку вы не используете оболочку для запуска команды, она не будет иметь никакого эффекта. - person Barmar   schedule 27.12.2013wait()
. - person Barmar   schedule 27.12.2013