【问题标题】:run background process linux simple shell. C++运行后台进程linux simple shell。 C++
【发布时间】:2013-02-28 21:33:33
【问题描述】:

我正在 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);

}

command 和 argv 是我从用户那里得到的。

如果 '&' 是命令的最后一部分,我需要在后台运行命令。我已经用 bg 的布尔变量检查了这一点。但我在使用 WAITPID() 函数时遇到问题,我不确定它的去向。

【问题讨论】:

  • 你看过waitpid(2)手册页中的例子吗?
  • waitpid 在接受用户的一行输入之前进入 shell 的读取循环。
  • 所以你说它应该看起来像这样code while(true) cout<<"enter command"<<endl; waitpid(,,); getline(cin,command); parse command then my if statements?

标签: c++ linux waitpid


【解决方案1】:

我猜你的问题是如果你最终直接调用waitpid(),你会阻塞,并且进程并没有真正在后台运行。您可以通过两种方式处理此问题。

  • 选择 1:避免该问题。叫 fork 一次后,让孩子再 fork 一次。让孙子执行命令,让子进程退出。父母像以前一样等待孩子,但孙子正在后台执行命令。孙子进程将被init 进程收割。

  • 选择 2:注意子进程完成的异步通知。当子进程死亡时,父进程将收到SIGCHLD 信号。让信号处理程序注意到这个信号并收获孩子。这可能需要您重新构建代码,以便同步服务员实际接收来自信号处理程序的同步通知。然后,您需要一种信号处理程序机制来区分前台子项和后台子项,并且只为前台子项发送同步通知。

【讨论】:

    猜你喜欢
    • 2011-05-30
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    相关资源
    最近更新 更多