Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.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 Fork()调用过程?_C_Fork - Fatal编程技术网

C Fork()调用过程?

C Fork()调用过程?,c,fork,C,Fork,假设我有以下代码: int main () { int i, r; i = 5; printf("%d\n", i); r = fork(); if (r > 0) { i = 6; } else if (r == 0) { i = 4; } printf("%d\n", i); } 我想知道分叉子进程是从一开始执行还是从调用它的地方开始执行。我问这个问题的原因是因为在我自己

假设我有以下代码:

int main () {

    int i, r;
    i = 5;
    printf("%d\n", i);
    r = fork();
    if (r > 0) {
        i = 6;
    }
    else if (r == 0) {
        i = 4;
    }
    printf("%d\n", i);
    }

我想知道分叉子进程是从一开始执行还是从调用它的地方开始执行。我问这个问题的原因是因为在我自己的系统上,我得到了输出5,6,4,这意味着从调用它的位置开始,但输入它,我得到了5,6,5,4?

一个进程调用
fork
,两个进程返回(尽管有错误)。这就是它的工作原理。因此,子项从下一个“行”开始(从技术上讲,它是从分配给
r
开始的)

您在这里看到的与缓冲有关。在联机情况下,您会发现它对标准输出使用完全缓冲,这意味着初始5尚未刷新到输出设备

因此,在fork中,父级和子级都有它,并且在某个点上都将刷新

对于行缓冲的情况,父行在换行符上刷新,因此该行不再位于fork的缓冲区中

规则是明确的。仅当已知输出设备为终端时,才将标准输出设置为线路缓冲。如果您重定向到某个文件,或在联机环境中捕获输出,以便对其进行清理以供浏览器输出,则该文件将被完全缓冲

这就是为什么你看到了不同


通常,在分叉之前刷新所有输出句柄(使用
fflush
)是一个好主意。

一个进程调用
fork
,两个进程返回(尽管有错误)。这就是它的工作原理。因此,子项从下一个“行”开始(从技术上讲,它是从分配给
r
开始的)

您在这里看到的与缓冲有关。在联机情况下,您会发现它对标准输出使用完全缓冲,这意味着初始5尚未刷新到输出设备

因此,在fork中,父级和子级都有它,并且在某个点上都将刷新

对于行缓冲的情况,父行在换行符上刷新,因此该行不再位于fork的缓冲区中

规则是明确的。仅当已知输出设备为终端时,才将标准输出设置为线路缓冲。如果您重定向到某个文件,或在联机环境中捕获输出,以便对其进行清理以供浏览器输出,则该文件将被完全缓冲

这就是为什么你看到了不同


通常,在分叉之前刷新所有输出句柄(使用
fflush
)是一个好主意。

一个进程调用
fork
,两个进程返回(尽管有错误)。这就是它的工作原理。因此,子项从下一个“行”开始(从技术上讲,它是从分配给
r
开始的)

您在这里看到的与缓冲有关。在联机情况下,您会发现它对标准输出使用完全缓冲,这意味着初始5尚未刷新到输出设备

因此,在fork中,父级和子级都有它,并且在某个点上都将刷新

对于行缓冲的情况,父行在换行符上刷新,因此该行不再位于fork的缓冲区中

规则是明确的。仅当已知输出设备为终端时,才将标准输出设置为线路缓冲。如果您重定向到某个文件,或在联机环境中捕获输出,以便对其进行清理以供浏览器输出,则该文件将被完全缓冲

这就是为什么你看到了不同


通常,在分叉之前刷新所有输出句柄(使用
fflush
)是一个好主意。

一个进程调用
fork
,两个进程返回(尽管有错误)。这就是它的工作原理。因此,子项从下一个“行”开始(从技术上讲,它是从分配给
r
开始的)

您在这里看到的与缓冲有关。在联机情况下,您会发现它对标准输出使用完全缓冲,这意味着初始5尚未刷新到输出设备

因此,在fork中,父级和子级都有它,并且在某个点上都将刷新

对于行缓冲的情况,父行在换行符上刷新,因此该行不再位于fork的缓冲区中

规则是明确的。仅当已知输出设备为终端时,才将标准输出设置为线路缓冲。如果您重定向到某个文件,或在联机环境中捕获输出,以便对其进行清理以供浏览器输出,则该文件将被完全缓冲

这就是为什么你看到了不同


通常,在分叉之前刷新所有输出句柄(使用
fflush
)是一个好主意。

在大多数情况下,无法判断父级将首先执行还是子级执行。输出不应该是
“5 6 5 4”
可能是缓冲区中的某个垃圾值。您可以使用
fflush(NULL)
fork()
之前刷新缓冲区,然后重试。

在大多数情况下,无法判断是先执行父级还是先执行子级。输出不应该是
“5 6 5 4”
可能是缓冲区中的某个垃圾值。您可以使用
fflush(NULL)
fork()
之前刷新缓冲区,然后重试。

在大多数情况下,无法判断是先执行父级还是先执行子级。输出不应该是
“5 6 5 4”
可能是缓冲区中的某个垃圾值。您可以使用
fflush(NULL)
fork()
之前刷新缓冲区,然后重试。

在大多数情况下,无法判断是先执行父级还是先执行子级。输出不应该是
“5 6 5 4”
可能是缓冲区中的某个垃圾值。您可以在
fork()
之前使用
fflush(NULL)
刷新缓冲区,然后重试。

通常,您的应用程序(及其两个进程线程)几乎无法控制进程线程在操作系统的运行队列上的组织方式。在fork()之后,没有您应该期望的特定顺序。事实上,如果你的