用C ++等待子进程与另一个子进程的麻烦

时间:2019-03-30 13:34:48

标签: c++ linux process child-process

我在c ++作业中无法控制三个子进程的输出顺序。

因此,分配的要求是创建三个子进程。 A,B和C。我可以做到。然后,我必须在三个子进程中执行一些操作。

A:打印“ A”的12步计数器,每次睡眠1秒 B:在两次打印“ A”之后打印“ B” C:运行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(&status)阻止输出C在输出B之前运行? 谢谢。

1 个答案:

答案 0 :(得分:0)

使用pause(2)使进程无限期地等待信号。由于这两个过程之间存在竞争,因此仍然有可能在对应的B之前打印C。您必须通过B流程进行交流,以防止这种情况。 wait(2)不能帮助:只有A进程永远退出(直到您大概在终端使用^C杀死整个进程组)。