UNIX 环境高级编程(九)—— fork 函数与 I/O 函数
来源:互联网 发布:淘宝闪电退款 编辑:程序博客网 时间:2024/06/05 11:04
#include "apue.h"int g_var = 6;char buf[] = "a write to stdout\n";int main(void){ int m_var = 0; pid_t pid; if (write(STDOUT_FILENO, buf, sizeof(buf)-1) != sizeof(buf)-1) err_sys("write error"); printf("before fork"); if ((pid = fork()) < 0){ err_sys("fork error"); } else if (pid == 0){ ++g_var; ++m_var; } else { sleep(2); } printf("pid = %ld, g_var = %d, m_var = %d\n", (long)getpid(), g_var, m_var); return 0;}
1. 采用标准输出
输出结果为:
a write to stdoutbefore forkpid = 15217, g_var = 7, m_var = 1pid = 15216, g_var = 6, m_var = 0
2. 重定向标准输出
在 if(write(STDOUT_FILENO, buf, sizeof(buf)-1) != sizeof(buf) - 1)
语句对标准输出进行重定向:
stdout = freopen("./test.txt", "w", stdout);
此时最终的输出结果为:
a write to stdoutbefore forkpid = 15177, g_var = 7, m_var = 1before forkpid = 15176, g_var = 6, m_var = 0
3. 解释
write 函数是不带缓冲的。在 fork 之前调用 write(write(STDOUT_FILENO, ...)
),所以其将数据写到标准输出一次。但,标准 IO 库是带缓冲的。
- 如果标准输出连到终端设备,则它是行缓冲的;
- 否则它是全缓冲的;
当以交互方式运行该程序时,只得到 printf("before fork\n")
输出的行一次,其原因是标准输出缓冲区由换行符冲洗。
但是当标准输出重定向到一个文件时,却得到printf 输出行两次。其原因是,在 fork 之前调用 printf 一次,但当调用 fork 时,该行数据仍在缓冲区中,然后在将父进程数据空间复制到子进程时,该缓冲区数据也被复制到子进程中。
0 0
- UNIX 环境高级编程(九)—— fork 函数与 I/O 函数
- UNIX 环境高级编程(八)—— fork 函数
- UNIX环境高级编程——标准I/O库函数和Unbuffered I/O函数
- unix环境高级编程之一( 基本I/O函数)
- UNIX环境高级编程——存储映射I/O(mmap函数)
- UNIX环境高级编程——存储映射I/O(mmap函数)
- 《unix高级环境编程》高级 I/O—— readv 和 writev 函数
- 《unix高级环境编程》高级 I/O—— readv 和 writev 函数
- 《Unix环境高级编程》读书笔记:常用文件I/O函数
- UNIX环境高级编程学习笔记(二)文件I/O常用函数
- UNIX环境高级编程学习笔记(三)文件共享和其他文件I/O函数
- UNIX网络编程------高级I/O函数(十四)
- UNIX环境高级编程——文件I/O
- UNIX环境高级编程——标准I/O库
- UNIX环境高级编程——标准I/O库
- Unix环境高级编程——文件I/O
- 《UNIX环境高级编程》 —— I/O
- 《UNIX环境高级编程》读书笔记 —— 文件 I/O
- 如何简单形象又有趣地讲解神经网络是什么?
- 51nod--多重背包
- 【转】纯CSS3制作的Tab选项卡
- 手机开发实战80——Javascript介绍2
- Android蓝牙篇:(一)基础篇
- UNIX 环境高级编程(九)—— fork 函数与 I/O 函数
- JavaScript:JSON详解
- Excel Sheet Column Number
- linux命令格式
- 手机开发实战81——浏览网页
- POJ 1111 Image Perimeters【单身快乐】【Bfs】
- IOS 获取时间秒数的问题
- 算法系列(七)数据结构之树的基本结构和二叉树的遍历
- 数据结构—非连通图的遍历