c++ - 运行后台进程 linux 简单 shell。 C++

标签 c++ linux waitpid

我正在 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 的 bool 变量检查过了。但我在使用 WAITPID() 函数时遇到问题,我不确定它的去向。

最佳答案

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

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

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

关于c++ - 运行后台进程 linux 简单 shell。 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15146060/

相关文章:

c++ - 不同类中的前置和后置增量运算符

linux - 当前目录中打开最后一个目录的别名

linux - 是否可以在子 shell 中修改父变量?

c - waitpid 子进程不成功

c++ - Qt、小部件刷新和 ui 交互性

c++ - wxWidgets 从套接字读取

c - 这个程序的输出结果是这样的

这段 C 代码可以创建僵尸进程吗?

c - 关于使用 fork() 创建的子进程的退出状态值的查询

c++ - 用 VS2013 编译的应用程序需要 VS2005 运行时