我正在编写一个程序,它接收一个命令名和参数以及最后的字符串“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参数时有效但在传递时我试图用“&amp;”替换它但它没有用,帮助是赞赏的人。
答案 0 :(得分:4)
程序背景的区别 - 或者不是 - 等待它完成,或者不等待。所以你真的不必使用两个不同的execvp。但是,您需要从参数中删除尾随bg。附加&amp;什么都不做 - &amp;是shell的元字符,它告诉shell不要等待正在执行的程序。
所以,你应该做的是:
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.