我试图弄清楚我为带有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);}
}
答案 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()
检查,以检查子进程是否成功生成。