父子进程同时执行吗

时间:2018-09-26 09:48:25

标签: c raspberry-pi3 raspbian

我试图弄清楚我为带有led矩阵的树莓派编写的以下程序是如何工作的。

该程序应该具有一个由主进程派生的子进程,在num = 0的第一次迭代中,LED从0,0 -0,8点亮。但是,LED会在第0列中随机点亮。

示例:在第0列0,6,4,5,2,3,1           在第一列0,6,5,4,2,3,1 直到第8列。

我对为什么控制行的“主”循环随机运行感到困惑,但是控制列的第二个循环以有序增加的方式工作。

fork和for循环一起使用时,我缺少什么?

从输出中,我只能猜测父级以某种方式立即创建了随机子进程,这些子进程使用其随机数num参数调用function2。

<header files>
function1
 {   creates a delay of a second through calculations }
function2(n)
 { for(int i = 0; i<=8 ;i++) 
      function1;
       printf("LED(%d,%d)\n",n,i);
  }
  main()
  {
    for(int num = 0; num <=7; num++)
         {
            pid_t pid = fork(); 
            if (pid ==0)
              {   function2(num); }  
          }
     for (int num =0; num <= 7; num++)
             { wait(NULL);}
     }    

1 个答案:

答案 0 :(得分:0)

父进程和子进程确实同时运行,并且无法预测哪个进程在何时运行。

从第一次检查开始,您就有一个循环,该循环从父进程开始,并创建8个子进程,每个子进程手上又创建了其他子进程!您应该在调用function2之后终止子进程,否则子进程将创建其他进程。

我认为您的问题的解决方案是这样的:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

void function1() {
    //0.5 seconds sleep
    usleep(500000);
}

void function2(int n) {
    for(int i = 0; i <= 8; i++)  {
        function1();
        printf("LED(%d,%d)\n", n, i);
    }
}
int main()
{
    pid_t pid;
    for(int num = 0; num <= 7; num++) {
        pid = fork(); 
        if (pid == 0) {
            function2(num);
            exit(0);
        }
    }
    for (int num = 0; num <= 7; num++){
        wait(NULL);
    }
    return 0;
}

请为以后的问题发个Minimal, Complete, and Verifiable example

代码也可能存在并发问题,我不认为printf是原子函数,因此可能需要使用信号灯,以避免有多个进程调用printf

另一个注意事项是应该进行fork()检查,以检查子进程是否成功生成。