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()之后,没有您应该期望的特定顺序。事实上,如果你的