Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
小实验 
主讲人:沈达 
初步判断 
实验结果 
关于缓冲区 
再看实验结果
初步判断 
#include <stdio.h> 
int main() 
{ 
int i; 
for (i = 0; i<2; i++) { 
printf("[-]"); 
fork(); 
} 
return 0; 
} 
p[-] f...
初步判断 
fork(); 
printf("[-]"); 
fork(); 
printf("[-]"); 
f p[-] f p[-] 
p[-] f p[-] 
o[-] f p[-] 
o[-] p[-] 
o[-][-] 
p[-] ...
实验结果 
fork(); 
printf("[-]"); 
fork(); 
printf("[-]"); 
实验结果:[-][-][-][-][-][-][-][-] 
printf("[-]"); 
fork(); 
printf("[-...
关于缓冲区 
1、下面的程序并不见得会输出hello-std-out,你知道为什么吗? 
#include <stdio.h> 
#include <unistd.h> 
int main() 
{ 
while(1) 
{ 
fprintf(...
关于缓冲区 
#include <stdio.h> 
#include <unistd.h> 
int main() 
{ 
while(1) 
{ 
fprintf(stdout,"hello-std-out"); 
fflush(stdou...
再看实验结果 
fork(); printf("[-]"); 
printf("[-]"); fork(); 
fork(); printf("[-]"); 
printf("[-]"); fork(); 
f p[-] f p[-] 
p[-...
再看实验结果 
#include <stdio.h> 
int main() 
{ 
int i; 
for (i = 0; i<2; i++) { 
printf("-"); 
fflush(stdout); 
fork(); 
} 
ret...
实验原理 
fork()系统调用的特性: 
fork()系统调用是Unix下以自身进程创建子进程的系统调用, 一次调用, 两次返 
回,如果返回是0,则是子进程,如果返回值>0,则是父进程(返回值是子进程的 
pid),这是众为周知的。 
还有...
参考资料 
一个fork的面试题 
C语言的谜题
Upcoming SlideShare
Loading in …5
×

关于Fork的一个小实验

155 views

Published on

关于fork的一个小实验,与缓冲区相关

Published in: Technology
  • Be the first to comment

  • Be the first to like this

关于Fork的一个小实验

  1. 1. 小实验 主讲人:沈达 初步判断 实验结果 关于缓冲区 再看实验结果
  2. 2. 初步判断 #include <stdio.h> int main() { int i; for (i = 0; i<2; i++) { printf("[-]"); fork(); } return 0; } p[-] f p[-] f o[-] p[-] f o[-][-] f p[-] f o[-] f 最后的结果就是: [-][-][-]
  3. 3. 初步判断 fork(); printf("[-]"); fork(); printf("[-]"); f p[-] f p[-] p[-] f p[-] o[-] f p[-] o[-] p[-] o[-][-] p[-] o[-] p[-] f p[-] o[-] f p[-] o[-] p[-] o[-][-] p[-] o[-] 最后的结果就是: [-][-][-][-][-][-]
  4. 4. 实验结果 fork(); printf("[-]"); fork(); printf("[-]"); 实验结果:[-][-][-][-][-][-][-][-] printf("[-]"); fork(); printf("[-]"); fork(); 实验结果:[-][-][-][-][-][-][-][-]
  5. 5. 关于缓冲区 1、下面的程序并不见得会输出hello-std-out,你知道为什么吗? #include <stdio.h> #include <unistd.h> int main() { while(1) { fprintf(stdout,"hello-std-out"); fprintf(stderr,"hello-std-err"); sleep(1); } return 0; } 参考答案:stdout和stderr是不是同设备描述符。stdout是块设备,stderr则不是。对于块 设备,只有当下面几种情况下才会被输入,1)遇到回车,2)缓冲区满,3)flush被调 用。而stderr则不会。
  6. 6. 关于缓冲区 #include <stdio.h> #include <unistd.h> int main() { while(1) { fprintf(stdout,"hello-std-out"); fflush(stdout); fprintf(stderr,"hello-std-err"); sleep(1); } return 0; } 添加fflush之后,就能正常输出hello-std-out了。
  7. 7. 再看实验结果 fork(); printf("[-]"); printf("[-]"); fork(); fork(); printf("[-]"); printf("[-]"); fork(); f p[-] f p[-] p[-] f p[-] b[-] f p[-] b[-] p[-] b[-][-] b[-] p[-] b[-][-] p[-] f p[-] b[-] f p[-] b[-] p[-] b[-][-] b[-] p[-] b[-][-] p[-] f p[-] f b[-] f p[-] f b[-] p[-] f b[-][-] f b[-][-] b[-][-] b[-] p[-] f b[-][-] f b[-][-] b[-][-]
  8. 8. 再看实验结果 #include <stdio.h> int main() { int i; for (i = 0; i<2; i++) { printf("-"); fflush(stdout); fork(); } return 0; } 实验结果:[-][-][-]
  9. 9. 实验原理 fork()系统调用的特性: fork()系统调用是Unix下以自身进程创建子进程的系统调用, 一次调用, 两次返 回,如果返回是0,则是子进程,如果返回值>0,则是父进程(返回值是子进程的 pid),这是众为周知的。 还有一个很重要的东西是,在fork()的调用处,整个父进程空间会原模原样地复制到 子进程中,包括指令,变量值,程序调用栈,环境变量,缓冲区,等等。 Unix下的设备有 块设备 和 字符设备 的概念,所谓块设备,就是以一块一块的数据存取 的设备,字符设备是一次存取一个字符的设备。磁盘、内存都是块设备,字符设备如键 盘和串口。块设备一般都有缓存,而字符设备一般都没有缓存。 而标准输出stdout是块设备,具有缓冲。缓冲的作用是尽可能少调用read和write系统调 用。
  10. 10. 参考资料 一个fork的面试题 C语言的谜题

×