首页 > 解决方案 > 在 C++ 中等待子进程与另一个子进程时遇到问题

问题描述

我无法在我的 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;
}


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

我预计结果是“AABAABAABCAABAABAAB C”但结果是“AABAACB ........”

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(&status)在输出 B 之前防止输出 C 操作?谢谢你。

标签: c++linuxprocesschild-process

解决方案


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


推荐阅读