gpt4 book ai didi

linux - 使用 c 中的 execvp 系统调用在后台运行程序

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:59:13 25 4
gpt4 key购买 nike

我正在编写一个程序,该程序接收命令名称和参数以及最后可选的字符串“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。附加 & 不会做任何事情 - & 是 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.

关于linux - 使用 c 中的 execvp 系统调用在后台运行程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20790765/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com