【发布时间】: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