我正在linux中创建一个简单的shell,但我无法获得在后台运行的命令。
到目前为止,这是我的代码:
create command,argv and check if it is to be ran in the background &
enter this code:
if(strcmp(command,"cd")==0)
{
chdir(argv[1]);
}
else if(strcmp(command,"clr") == 0)
{
if ((pid = fork()) == 0)
{
execvp("clear",argv);
}
wait(&status);
}
else
{
if ((pid = fork()) == 0)
{
execvp( prog, argv );
}
wait(&status);
}
命令和argv是我从用户那里得到的。
如果'&'我需要在后台运行一个命令是命令的最后一部分。我已经用布尔变量bg检查了它。但是我遇到了WAITPID()函数的问题,我不知道它在哪里。
答案 0 :(得分:2)
我想您的问题是,如果您最终直接调用waitpid()
,则会阻止,并且该进程实际上并未在后台运行。您可以通过两种方式处理此问题。
选择1:避免问题。在调用fork一次之后,再让子fork一次。让孙子执行命令,让孩子退出。父母像以前一样等待孩子,但孙子在后台执行命令。孙子进程将由init
进程获得。
选择2:注意孩子完成的异步通知。当子进程终止时,父进程将收到SIGCHLD
信号。让信号处理程序注意到这个信号并收获孩子。这可能需要您重构代码,以便同步服务器实际接收来自信号处理程序的同步通知。然后,您需要一种信号处理程序机制来区分前景和后台子节点,并且只为前台子节点发送同步通知。