LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1235|回复: 6

请问大家一个程序的执行过程

[复制链接]
发表于 2004-2-12 08:52:59 | 显示全部楼层 |阅读模式
今天看了个copy文件的源代码,里面有些具体执行过程不是很了解。
疑惑部分已经在源程序中标注了,麻烦大家看看源程序,然后给我解答,谢谢啦
源程序如下:
#include<stdio.h>
main(int argc,char *argv[])
{ FILE *fileIn,*fileOut;
  if(argc!=3) {printf("Arguments error\n"); exit(-1);}
  if ((fileIn = fopen(argv[1],"r")) ==NULL) {printf("Can't open %s\n",argv[1]);exit(-1);}  /*fopen是把整个文件的内容读入内存的意思吗?*/         
  if ((fileOut = fopen(argv[2],"w"))== NULL) {printf("Can't open %s\n",argv[2]);exit(-1);}
  while(!feof(fileIn))  putc(getc(fileIn),fileOut);  /*能说说这里的读写过程吗?*/
  fclose(fileIn);  fclose(fileOut);
}
发表于 2004-2-12 10:00:55 | 显示全部楼层
第一个你的理解是对的,你可以去找相关函数说明,man fopen。
feof(检查文件流是否读到了文件尾),如果没有到文件尾,getc读一个,putc复制一个,一直到文件尾结束。
 楼主| 发表于 2004-2-12 11:01:52 | 显示全部楼层
那样的话,我copy了一个500多M的文件,但是我的内存只有256M,在拷贝过程中(目标文件只有7M的时候),我把源文件给删除了,最后还是生成一个一摸一样的目标文件500多M……能否解释一下?
发表于 2004-2-12 11:19:12 | 显示全部楼层
第一个fopen是用读的方式打开愿文件吧
第二个fopen是用写的方式创建个新文件吧
getc应该是从fopen打开的描述字来读取数据,然后putc把读的数据写如fopen产生的第2个描述字
这应该就是复制的过程吧
发表于 2004-2-12 11:24:56 | 显示全部楼层
fopen 只是打开一个 file handle,并不负责任何读取、写入的io操作。至于那个读写过程,更是相当基本的代码,任何一个c语言书都会介绍。

其实这些问题不需要到论坛上来问,找本真正的c教科书看一遍就可以解决问题了。

至于那个删除文件的问题,应该和文件系统的构造有关系。一个文件的存储也就是一堆节点的问题,只要找到第一个节点,就可以把后面所有节点找到。删除文件的操作实际主要是是修改了那个记录第一个节点的目录的资料。这就象一个图书馆懒惰的员工,当要撤下2003年的某期刊时,他只是去掉图书检索卡里的指向该刊2003年第一期的资料;这不妨碍已经检索到2003第一期的读者找到2003所有的资料。所以删除也不影响我们正在运行的拷贝程序,因为他在运行的开始早已经知道了这第一个节点的位置。
发表于 2004-2-12 17:07:56 | 显示全部楼层
fgets()的例子

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void process_record( char *buf )
  4. {
  5.     printf( "%s\n", buf );
  6. }
  7. int main( void )
  8. {
  9.     FILE *fp;
  10.     char buffer[100];
  11.     fp = fopen( "file", "r" );
  12.     fgets( buffer, sizeof( buffer ), fp );
  13.     while( ! feof( fp ) ) {
  14.         process_record( buffer );
  15.         fgets( buffer, sizeof( buffer ), fp );
  16.     }
  17.     fclose( fp );
  18.     return EXIT_SUCCESS;
  19. }
复制代码

putc()的例子

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main( void )
  4. {
  5.     FILE* fp;
  6.     int c;
  7.     fp = fopen( "file", "r" );
  8.     if( fp != NULL ) {
  9.         while( (c = fgetc( fp )) != EOF ) {
  10.             putc( c, stdout );
  11.         }
  12.         fclose( fp );
  13.     }
  14.     return EXIT_SUCCESS;
  15. }
复制代码
发表于 2004-2-12 19:32:52 | 显示全部楼层
删除的问题是因为系统保存着文件的引用计数,你删除文件的时候只是删掉了文件的目录项,如果文件的引用计数为0,系统就会删掉文件。
你删除文件的时候,因为有进程已经打开了文件,所以文件的引用计数至少为1,如果文件没有其它引用的话,当你的进程关闭文件的时候系统就会真正删除文件了。
这个特性在创建临时文件的时候经常用,先创建并打开一个临时文件,而后马上调用unlink删除文件,这样如果崩溃了就不会在文件系统里留下临时文件。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表