【问题标题】:Printing a matrix containing processes in C在 C 中打印包含进程的矩阵
【发布时间】:2020-12-22 20:14:08
【问题描述】:

我编写了一个 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
    

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

【问题讨论】:

  • 当你 fork 一个进程时,不能保证(从用户态的角度)内核接下来会调度哪个进程。因此,您无法确定父进程是否会分叉,立即将执行交给子进程,并让内核再次为父进程调度执行。如果你想沿着这条路线走,你应该使用 wait 系统调用来确保父级阻塞直到子级退出
  • puts("\n") 永远不会被执行,因为它在exit() 之后。
  • @Barmar 我忘了删除它,这是一个尝试。
  • 数组大部分是无关紧要的——你不需要它来获取你正在打印的信息。让父进程打印矩阵会更简单(因此它再次变得相关)。
  • @JonathanLeffler 我知道。在我的项目中,我必须使用一个包含进程的半填充数组,所以我为自己做了一个练习,以更好地理解它是如何工作的。

标签: c matrix printing process pid


【解决方案1】:

在父进程处理循环体后添加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;
}

【讨论】:

  • 这比我想象的要简单!非常感谢。
猜你喜欢
  • 2016-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多