C++ fork()以及缓冲结合考点
来源:互联网 发布:java struct 编辑:程序博客网 时间:2024/05/29 16:54
字符串"Hello"会被输出几次?
int main() { printf("Hello"); fork(); printf("Hello");}
分两点说吧:
1.fork()函数会把它所在语句以后的语句复制到一个子进程里,单独执行。
2.如果printf函数最后没有"\n",则输出缓冲区不会被立即清空,而fork函数会把输出缓冲区里的内容也都复制到子进程里。
所以,父进程和子进程各输出2个Hello,共4个。
如果第一个printf("Hello");写成printf("Hello\n");,则只会输出3个Hello,父进程2个,子进程1个。
首先需要知道fork()系统调用的特性:
fork()是以自身进程创建子进程的系统调用,一次调用,两次返回,如果返回是0,则是子进程,如果返回值>0,则是父进程(返回值是子进程的pid),这是众为周知的。还有一个很重要的东西是,在fork()的调用处,整个父进程空间会原模原样地复制到子进程中,包括指令,变量值,程序调用栈,环境变量,缓冲区,等等。
所以,上面的那个程序为什么会输入4个“Hello”,这是因为fork()前面的printf("Hello");语句有buffer.所以,对于上述程序,printf("Hello");把“Hello”放到了缓存中,并没有真正的输出,在fork()的时候,缓存被复制到了子进程空间,所以,就成了4个,而不是3个。
程序遇到“\n”,或是EOF,或是缓中区满,或是文件描述符关闭,或是主动flush,或是程序退出,就会把数据刷出缓冲区。需要注意的是,标准输出是行缓冲,所以遇到“\n”的时候会刷出缓冲区,但对于磁盘这个块设备来说,“\n”并不会引起缓冲区刷出的动作,那是全缓冲,你可以使用setvbuf来设置缓冲区大小,或是用fflush刷缓存。
0 0
- C++ fork()以及缓冲结合考点
- fork缓冲
- GDIPLUS环境初始化以及与GDI结合实现双缓冲
- C fork()&&fork()||fork()
- fork子进程缓冲
- fork与行缓冲
- fork,printf缓冲
- C语言笔试考点
- C笔试常见考点
- c面试考点
- 2007: C语言考点分布
- c/c++易考点整理
- c fork
- 考点
- 谈IO与fork结合
- fork结合逻辑与或
- fork举例和行缓冲全缓冲的理解
- 从一个fork()实例理解全缓冲与行缓冲
- Codeforces Round #377 (Div. 2) D Exams
- Word没有到一行自动换行如何解决
- python tuple元组
- django常见错误
- ORACLE中排序ORDER BY
- C++ fork()以及缓冲结合考点
- CNN的反向求导及练习
- Kali Linux 无线渗透测试入门指南 第三章 绕过 WLAN 身份验证
- linux中的显式运行时链接---dlopen、dlsym、dlerror、dlclose搞起
- 最长公共子序列
- 小白日记36:kali渗透测试之Web渗透-手动漏洞挖掘(二)-突破身份认证,操作系统任意命令执行漏洞
- python 实现ftp文件下载
- Ubuntu日记——安装和配置Lavarel项目
- tensorflow学习笔记(六):LSTM 与 GRU