免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 968 | 回复: 0
打印 上一主题 下一主题

unix系统编程 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-08-07 15:59 |只看该作者 |倒序浏览
   /*第四章    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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP