在 C 中打印包含进程的矩阵
Printing a matrix containing processes in 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
我试图在分叉后添加一个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;
}
我编写了一个 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
我试图在分叉后添加一个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;
}