如何解决在 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 举报,一经查实,本站将立刻删除。