Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Unix系统调用以先升后降的顺序打印数字_C_Unix_Fork - Fatal编程技术网

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