免费注册 查看新帖 |

Chinaunix

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

linux下open了的文件被delete [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-08-02 22:19 |只看该作者 |倒序浏览
  不是说打开了的文件不能被删除吗?为什么我用open()的文件被我编写的程序给rm了?
  以下是我的代码:
  /* open.c*/
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <limits.h>
#include <unistd.h>
#include <dirent.h>
#include <stdarg.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>

main(){
        int fd;
        fd=open("/home/oyls/execvp.c",O_RDONLY);
        sleep(10);
        printf("%d\n",fd);       
        }


/*rm_file.c*/
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <limits.h>
#include <unistd.h>
#include <dirent.h>
#include <stdarg.h>
#include <sys/stat.h>

int remove_file(const char *path)
{
  struct stat statbuf;
  if(lstat(path,&statbuf)<0)
    printf("Error lstat \n");
   
                if (unlink(path) < 0) {
                        printf("unable to remove %s\n", path);
                        return -1;
                }
                return 0;
}

main(){  
        if(remove_file("/home/oyls/execvp.c")<0)
          printf("Error remove  \n");
        }

论坛徽章:
0
2 [报告]
发表于 2006-08-02 22:21 |只看该作者
如果A打开了文件a,并且在close前删除了a,那么a会在A进程结束后被删除(系统会检查是否还有哪个进程打开着文件,如果有,就让这个进程还能对这个文件进行操作,如果没有,就删除它)。这个方法可以创造临时文件

论坛徽章:
0
3 [报告]
发表于 2006-08-02 22:32 |只看该作者
楼上你好,根据我的测试,结果跟你说的有些出入:
   先是打开文件,在10秒内删除文件(这时open程序没结束),在这时我ls了一下,那个文件已经被删,隔了一段时间,才open程序才返回文件描述字;

论坛徽章:
0
4 [报告]
发表于 2006-08-02 22:36 |只看该作者
先是打开文件,隔了一段时间,才open程序才返回文件描述字;


什么意思?

论坛徽章:
0
5 [报告]
发表于 2006-08-02 22:40 |只看该作者
你看一下我的代码就知道了,我要它行sleep 10 秒,在这10秒钟里,另一个程序执行删除它的动作,open程序再显示它的文件描述符.或许你运行一下就知道了.

论坛徽章:
0
6 [报告]
发表于 2006-08-03 00:57 |只看该作者
原帖由 paraller06 于 2006-8-2 22:19 发表
  不是说打开了的文件不能被删除吗?为什么我用open()的文件被我编写的程序给rm了?
  以下是我的代码:
  /* open.c*/
#include <time.h>
#include <stdlib.h>
#include <stdio.h> ...


有没有《APUE》?回去好好学第四章!

论坛徽章:
0
7 [报告]
发表于 2006-08-03 01:16 |只看该作者
打开了的时候是可以删除的。
只不过打开的时候删除,如果引用计数!=0他不会释放空间的。

论坛徽章:
0
8 [报告]
发表于 2006-08-03 08:34 |只看该作者
Linux 确实是可以 删除一个已经打开的文件的

论坛徽章:
0
9 [报告]
发表于 2006-08-03 08:45 |只看该作者



  1. #include <stdio.h>

  2. main()
  3. {
  4. FILE *fp;
  5. int i;
  6.     fp = fopen("1111", "w+");
  7.     if(!fp) return 0;

  8.     if(unlink("1111")) printf("error delete file.\n");

  9.     i = fwrite("12345678", 1, 9, fp);
  10.     printf("write %d bytes\n", i);

  11.     if(0 == fork()) {
  12.         char buf[128];
  13.         memset(buf, 0, 128);
  14.         fseek(fp, 0, 0);
  15.         i = fread(buf, 1, 128, fp);
  16.         printf("child read %d %s\n", i, buf);

  17.         exit(0);
  18.     }
  19.     fclose(fp);
  20. }
复制代码

论坛徽章:
0
10 [报告]
发表于 2006-08-03 09:06 |只看该作者
如果进程打开一个文件后这个文件被别的进程删除,这个文件只是看起来被删除了而已,你用 ls 看不到,但是 A 进程仍然可以对文件进行操作。在 A 进程关闭这个文件之后,文件才会真正的被删除。

还有你能打印出 fd 跟这个文件能不能用并没有关系,那个 fd 只不过是一个变量,总是可以打印的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP