微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在 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;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。