在 C 中打印包含进程的矩阵

问题描述

我编写了一个 C 程序,其中一个 5x5 矩阵通过在每个单元格中分叉来生成一个进程。问题是,如果我尝试打印 PID,它不会正确打印矩阵。代码如下:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#define ROW 5
#define COL 5

int main (){

pid_t pid_matrix[ROW][COL];
  
for (size_t row = 0; row < ROW; ++row){
    for (size_t col = 0; col < COL; ++col){
        pid_matrix[row][col] = fork();
        if (pid_matrix[row][col] == -1){
            // Error! 
        }
        else if (pid_matrix[row][col] == 0){
            printf("\t%d",getpid());
            exit(EXIT_SUCCESS);  
        } 
    }
    printf("\n");
}

    return 0;
}

实际上我的代码打印了这个:

    14233
    14234   14235   14236   14237   14238   14239   14240
    14241   14242   14243   14244   14245
    14246   14247   14248   14249   14250
    14251   14252   14253   14254
    14256   14255   14257

我尝试在 fork 后添加 sleep,但结果是这样的:

    14158   14159   14162   14163
    14164   14165   14166   14167   14168
    14169   14170   14171   14175   14176
    14177   14178   14179   14180   14181
    14182   14183   14184   14185   14186
    14187

当然,我想要的代码会打印如下内容

    14158   14159   14162   14163   14164
    14165   14166   14167   14168   14169
    14170   14171   14172   14173   14174
    14175   14176   14177   14178   14179
    14182   14183   14184   14185   14186
    

我做错了什么?我需要在代码中更正什么才能正确打印矩阵?

解决方法

在父进程中处理循环体后添加 wait() 即可。这将确保子进程在处理矩阵中的另一个条目之前已经完成。

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

#define ROW 5
#define COL 5

int main (){

pid_t pid_matrix[ROW][COL];
  
for (size_t row = 0; row < ROW; ++row){
    for (size_t col = 0; col < COL; ++col){
        pid_matrix[row][col] = fork();
        if (pid_matrix[row][col] == -1){
            // Error! 
        }
        else if (pid_matrix[row][col] == 0){
            printf("\t%d",getpid());
            exit(EXIT_SUCCESS);  
        } 
        wait(NULL);
    }
    printf("\n");
}

    return 0;
}