- 论坛徽章:
- 0
|
/*第四章 07.08.06*/
1 在C语言中,FILE结构包括一个缓冲区与一个文件描述符值,而通常的磁盘文件都是完全缓冲的,也就是说fprintf实际上并没有将要写的文件直接写到硬盘中,而是写到FILE结构的缓冲区中,当缓冲区填满时才会调用write将其缓冲区中的内容写到硬盘中。但是write的操作完成并不意味着数据实际上已写入到磁盘了,事实上操作系统将数据给复制到了一个系统高速缓存中去了,然后系统周期地将这些数据块给写到磁盘中。此时可以通过调用fflush来强制写出FILE结构中的内容,也可调用setvbuf来禁止缓冲。
2 与终端相关的文件是行缓冲,而不是完全缓冲的,但是标准错误文件除外,一般情况下它是不缓冲的。对输出来说行缓冲意味着在缓冲区填满前或遇到一个新行符号前,行不会被写出。
3 注意以下代码的输出:
#include
int main(void)
{ int i ;
fprintf(stdout, "a");
scanf("%d",&i);
fprintf(stderr,"a has been written\n");
fprintf(stdout,"b");
fprintf(stderr,"b has been written\n");
fprintf(stdout ,"\n");
return o;
}
请注意,stderr文件是不缓冲的,而stdout文件是行缓冲的,但是此外的scanf函数在输入之前是要刷新stdout的缓冲区,所以‘a‘是在读入数据之前显示的。
4 fork创建一个子进程时,子进程继承了父进程的环境与上下文中大部分的内容的一份挎贝,对于父进程先前打开的文件来说,二者之间共享相同的文件偏移量。
另外 请注意以下程序的输出:
#include
#include
int main (void)
{ printf("this is my output.");
fork();
return 0;
}
由于fork在创建新的进程时会复制用户空间的东西,而prinf由于缓冲的原因可能会导致要写的东西会被写到stdout的缓冲区中,而不会被写到实际的输出设备。由于这个缓冲区也是用户空间的一部分,所以它会被fork复制,父进程与子进程每次终止时,从main的返回都会将缓冲区作为清理的一部分清空。所以会输出二个this is my output.this is my output.但是要是在输出语句中加入换行符的话,则只会输出一个。
5 重定向是通过如下步骤来实现的:(p93)
当一个文件被打开后,就会在系统文件表中创建一个条目,程序可以对系统文件表中的条目进行修改,使其指向系统文件表中的另一个条目,这就是得定向。
先打开一个文件 ,在系统文件表中建立一个新的条目,然后执行dup2函数,将指向该文件 的指针复制到标准输出 的条目中,最后调用close来删除原文件额外的文件描述符表条目。
open前 dup2后 close后
[0]标准输入 [0]标准输入 [0]标准输入
[1]标准输出 [1]写入 my.file [1]写入my.file
[2]标准错误 [2]标准错误 [2] 标准错误
[3]写入my.file [3]写入my.file
此处的dup2(int fd1,int fd2),若后者是打开的,dup2就将其关闭,再将fd1 指针复制到fd2中去。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/45292/showart_355461.html |
|