C Unix系统调用以先升后降的顺序打印数字
我有一个小程序,需要按以下格式打印一些数字:C Unix系统调用以先升后降的顺序打印数字,c,unix,fork,C,Unix,Fork,我有一个小程序,需要按以下格式打印一些数字: 0 1 2 3 4 3 2 1 0 我尝试用以下C代码来实现: int main() { int i; for (i = 0; i < 5 && !fork(); i++) { printf("%d ", i); } wait(NULL); return 0; } 我不知道如何省略多余的数字。有人知道怎么了吗 新线在哪里 操作系统可以自由选择一个进程而不是另
0 1 2 3 4
3
2
1
0
我尝试用以下C代码来实现:
int main() {
int i;
for (i = 0; i < 5 && !fork(); i++) {
printf("%d ", i);
}
wait(NULL);
return 0;
}
我不知道如何省略多余的数字。有人知道怎么了吗
每次迭代
fork
s都是一个新的子项。父对象退出循环,等待子对象,子对象打印迭代编号。但是,由于没有换行符,字符保持缓冲状态。但是,每个fork
都会在其当前状态下复制缓冲区。因此,每个子级都从其祖先继承所有打印的值,并等待其子级在退出之前死亡。因此,正如最后一个子项退出一样,缓冲区如下所示:
parent: ""
child-0 : "0 "
child-1 : "0 1 "
child-2 : "0 1 2 "
child-3 : "0 1 2 3 "
child-4 : "0 1 2 3 4 "
child-4退出(因为wait
不会阻塞),导致其stdout
缓冲区被刷新。这会导致child-3从wait
返回并退出,从而刷新其stdout
缓冲区。这将一直持续到父级退出,因此您将看到以下内容(所有内容都在一行中,因为没有换行):
要解决此问题,只需在打印前刷新缓冲区即可。这将强制父缓冲区的子副本按顺序输出,然后子缓冲区自己的输出将按相反顺序退出:
int main() {
int i;
for (i = 0; i < 5 && !fork(); i++) {
fflush(stdout);
printf("%d ", i);
}
wait(NULL);
return 0;
}
您是否需要使用
fork
?换行符来自何处?是否有方法将其合并到一个循环中?!for循环中的fork()可以更改,并且可以在第一个printf上方插入一行,除了所有内容都必须保持不变之外。如果您将换行添加到所获得的不正确的输出中,那么我们是否可以假设您也将换行添加到正确的示例输出中?
0 1 2 3 4 0 1 2 3 0 1 2 0 1 0
int main() {
int i;
for (i = 0; i < 5 && !fork(); i++) {
fflush(stdout);
printf("%d ", i);
}
wait(NULL);
return 0;
}
0 1 2 3 4 3 2 1 0