操作系统: Linux,语言: 纯 C
我正在学习一般的 C 编程,特殊情况下在 UNIX 下学习 C 编程。
在使用 fork()
调用之后,我检测到 printf()
函数的一个奇怪的(对我来说)行为。
密码
#include <stdio.h>
#include <system.h>
int main()
{
int pid;
printf( "Hello, my pid is %d", getpid() );
pid = fork();
if( pid == 0 )
{
printf( "\nI was forked! :D" );
sleep( 3 );
}
else
{
waitpid( pid, NULL, 0 );
printf( "\n%d was forked!", pid );
}
return 0;
}
输出
Hello, my pid is 1111
I was forked! :DHello, my pid is 1111
2222 was forked!
为什么第二个“ Hello”字符串出现在子输出中?
是的,它正是父进程开始时打印的内容,使用父进程的 pid
。
但是,如果我们在每个字符串的末尾放置一个 \n
字符,我们就会得到预期的输出:
#include <stdio.h>
#include <system.h>
int main()
{
int pid;
printf( "Hello, my pid is %d\n", getpid() ); // SIC!!
pid = fork();
if( pid == 0 )
{
printf( "I was forked! :D" ); // removed the '\n', no matter
sleep( 3 );
}
else
{
waitpid( pid, NULL, 0 );
printf( "\n%d was forked!", pid );
}
return 0;
}
产出 强 > :
Hello, my pid is 1111
I was forked! :D
2222 was forked!
为什么会发生这种情况? 这是正确的行为,还是一个错误?