【问题标题】:Having trouble with waiting a child process with another child process in c++在 C++ 中等待子进程与另一个子进程时遇到问题
【发布时间】:2019-03-30 13:34:48
【问题描述】:

在我的 c++ 分配中控制三个子进程的输出顺序时遇到问题。

所以赋值的要求是创建三个子进程。 A,B和C。我可以完成它。然后我不得不在三个子进程中做一些操作。

A:12 步计数器,每次打印“A”并休眠 1 秒 B:在两个打印的“A”之后打印“B” C:运行 B 3 次后打印“C”

我必须保持进程运行才能完成任务...

sig_atomic_t sigusr1_count = 0;
bool bNeedDoWork = false;
bool cNeedDoWork = false;

void handlerForStep (int signal_number) //signal handler
{
 ++sigusr1_count;
}

void handlerForB (int signal_number) //signal handler
{
 bNeedDoWork = true;
}

void handlerForC (int signal_number) //signal handler
{
 cNeedDoWork = true;
}

int main() {
 using namespace std;
 pid_t childA_pid, childB_pid, childC_pid;

 /* Set up A handler operation*/
 struct sigaction sa; 
 memset (&sa, 0, sizeof (sa)); 
 sa.sa_handler = &handlerForStep; 
 sigaction (SIGUSR1, &sa, NULL); 

 childA_pid = fork();
 if (childA_pid == 0) {
   for (int i = 0; i < 12; i++) {
     system("echo A");
     kill(getppid(), SIGUSR1);
     sleep(1);
   }
   exit(0);

 } else {
   childB_pid = fork();
   if (childB_pid == 0) {

     /*Set up B handler operation*/
     /*...*/

     //sleep until handler B receive signal
     while (true) {
       sleep(1);
       if (bNeedDoWork) {
         bNeedDoWork = false;
         system("echo B");
       }
     }
     exit(0);

   } else {
     childC_pid = fork();
     if (childC_pid == 0) {

       /*Set up C handler operation*/
       /*...*/

       //sleep until handler C receive signal
       while (true) {
         sleep(1);
         if (cNeedDoWork) {
           cNeedDoWork = false;
           system("echo C");
         }
       }
       exit(0);

     } else {
       while (true) {
         sleep(1);
         if (sigusr1_count != 0 && sigusr1_count % 2 == 0) {
           kill(childB_pid, SIGUSR1);
         }
         if (sigusr1_count != 0 && sigusr1_count % 6 == 0) {
           kill(childC_pid, SIGUSR1);
         }
       }
     }
   }
 }
 return 0;
}


有点长。但我担心这是生成流程的真正正确方法。

我希望结果是“A A B A A B A A B C A A B A A B A A B C” 但结果是“A A B A A C B ........”

C 在 B 打印之前打印。甚至一些字母 A、B、C 在这个序列之后都被弄乱了。

这是区分B进程和C进程的计数方法吗:

if (sigusr1_count != 0 && sigusr1_count % 2 == 0) {
   kill(childB_pid, SIGUSR1);
}
if (sigusr1_count != 0 && sigusr1_count % 6 == 0) {
   kill(childC_pid, SIGUSR1);
}

正确吗?

是否可以使用wait(&amp;status) 来防止在输出 B 之前操作输出 C ? 谢谢。

【问题讨论】:

  • 您的BC 进程需要休眠超过一秒,不是吗?事实上,他们不应该无限期地pause()吗?
  • 我假设信号是分配所必需的,但管道会更简单,更容易在这里变得健壮。
  • 但是如果 B 和 C 的睡眠时间更长,A 的输出可能会在 B 和 C 的输出之前每 1 秒打印 3 次或 4 次作为 A 输出
  • 任何捕捉到的信号interrupts sleep!
  • 对不起,我仍然无法理解信号和睡眠之间的关系。你能进一步解释甚至展示一些例子吗?如果可以的话非常感谢!我对这个话题很陌生。

标签: c++ linux process child-process


【解决方案1】:

使用pause(2) 让进程无限期地等待信号。由于这两个进程之间存在竞争,仍然可以在对应的 B 之前打印 C;您必须从 B 进程回传以防止这种情况发生。而wait(2) 也无能为力:只有 A 进程 ever 退出(大概直到您在终端使用 ^C 杀死整个进程组)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多