【问题标题】:do parent and child process execute concurrently父进程和子进程是否同时执行
【发布时间】:2018-09-26 09:48:24
【问题描述】:

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

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

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

我很困惑为什么控制行的“主”循环随机运行,但控制列的第二个循环以有序递增的方式运行。

在 fork 和 for 循环的工作中我缺少什么?

从输出中,我只能猜测父进程以某种方式同时创建了随机子进程,这些子进程使用随机数参数调用 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);}
     }    

【问题讨论】:

    标签: c raspberry-pi3 raspbian


    【解决方案1】:

    父子进程确实是同时运行的,无法预测哪个进程在什么时间运行。

    从第一次检查开始,您有一个从父进程开始并创建 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()来检查子进程是否生成成功。

    【讨论】:

    • 我还没有终止子进程,但我的程序没有与子进程一起进行。我使用 if 块来检查子进程以缓解该特定问题。块的父级是否一次创建所有子进程?
    • 我已经测试了您发布的代码,结果function2 被调用了 1024 次,因为您没有终止子进程。而如果终止孩子,则结果为 8 次。不,父亲不会同时生成所有子进程。我想你误解了if (pid == 0) 语句,这会检查这是否是最后一个fork 的进程,而不是程序的根进程,子进程fork 也是如此!您可以在此处找到更多详细信息:stackoverflow.com/questions/3213754/c-iterative-multiple-forks
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多