Linux 에서 link, unlink, close, fclose 상세 설명
unlink系统调用】
功能描述:
从文件系统中删除一个名称。如果名称是文件的最后一个连接,并且没有其它进程将文件打开,名称对应的文件会实际被删除。
用法:
#include <unistd.h>
int unlink(const char *pathname);
参数:
pathname:指向需解除连接的文件名。
返回说明:
成功执行时,返回0。失败返回-1,errno被设为以下的某个值
EACCES:权能不足
EFAULT: 内存空间不可访问
EIO:发生输入输出错误
EISDIR:pathname索引的是目录
ELOOP :路径解析的过程中存在太多的符号连接
ENAMETOOLONG:路径名超出可允许的长度
ENOENT:路径名部分内容表示的目录不存在,或者是悬浮的连接
ENOMEM: 核心内存不足
ENOTDIR:路径名的部分内容不是目录
EPERM : 文件系统不支持文件或者目录的解除连接,也有可能是权限步允许
EROFS :文件系统只读
모든 파일 은 하나의 struct stat 구조 체 를 통 해 파일 정 보 를 얻 을 수 있 습 니 다. 그 중의 한 구성원 stnlink 는 파일 의 링크 수 를 대표 합 니 다.
셸 의 touch 명령 이나 프로그램 에서 open 을 통 해 O 가 있 을 때CREAT 가 존재 하지 않 는 파일 일 때 파일 의 링크 수 는 1 입 니 다. 일반적으로 open 에 존재 하 는 파일 은 파일 의 링크 수 에 영향 을 주지 않 습 니 다.open 의 역할 은 호출 프로 세 스 와 파일 사이 에 접근 관 계 를 만 드 는 것 입 니 다. 즉, open 후 fd 로 돌아 갑 니 다. 호출 프로 세 스 는 fd 를 통 해 read, write, ftruncate 등 일련의 파일 작업 을 할 수 있 습 니 다. close () 는 이러한 호출 프로 세 스 와 파일 간 의 접근 관 계 를 없 애 는 것 입 니 다.자 연 스 럽 게 파일 의 링크 수 에 영향 을 주지 않 습 니 다.close 를 호출 할 때 커 널 은 이 파일 을 여 는 프로 세 스 수 를 검사 합 니 다. 이 수가 0 이면 파일 의 링크 수 를 더 검사 합 니 다. 이 숫자 도 0 이면 파일 내용 을 삭제 합 니 다. 링크 함수 가 새 디 렉 터 리 항목 을 만 들 고 링크 수 를 추가 합 니 다. unlink 함수 가 디 렉 터 리 항목 을 삭제 하고 링크 수 를 줄 입 니 다.링크 수가 0 이 되 고 프로 세 스 가 이 파일 을 열지 않 으 면 이 파일 의 내용 이 진정 으로 삭 제 됩 니 다.unlink 이전에 close 가 없 으 면 파일 내용 에 접근 할 수 있 습 니 다. 요약 하면 링크 수 에 영향 을 주 는 작업 은 링크, unlink, open 의 생 성 입 니 다. 파일 내용 을 삭제 하 는 진정한 의 미 는 파일 의 링크 수가 0 이 고 이 작업 의 본질 적 인 완성 자 는 unlink 입 니 다.close 는 파일 내용 을 삭제 하 는 작업 을 할 수 있 습 니 다. close 전에 unlink 작업 이 있 기 때 문 입 니 다.
예 를 들 어 간단 한 설명: 셸 을 통 해 touch test.txt
1、stat("test.txt",&buf);
printf("1.link=%d
",buf.st_nlink);//未打开文件之前测试链接数
2、fd=open("test.txt",O_RDONLY);//打开已存在文件test.txt
stat("test.txt",&buf);
printf("2.link=%d
",buf.st_nlink);//测试链接数
3、close(fd);//关闭文件test.txt
stat("test.txt",&buf);
printf("3.link=%d
",buf.st_nlink);//测试链接数
4、link("test.txt","test2.txt");//创建硬链接test2.txt
stat("test.txt",&buf);
printf("4.link=%d
",buf.st_nlink);//测试链接数
5、unlink("test2.txt");//删除test2.txt
stat("test.txt",&buf);
printf("5.link=%d
",buf.st_nlink);//测试链接数
6、重复步骤2 //重新打开test.txt
7、unlink("test.txt");//删除test.txt
fstat(fd,&buf);
printf("7.link=%d
",buf.st_nlink);//测试链接数
8、close(fd);//此步骤可以不显示写出,因为进程结束时,打开的文件自动被关闭。
상기 8 단 계 를 순서대로 실행 한 결 과 는 다음 과 같다.
1.link=1
2.link=1 //open不影响链接数
3.link=1 //close不影响链接数
4.link=2 //link之后链接数加1
5.link=1 //unlink后链接数减1
2.link=1 //重新打开 链接数不变
7.link=0 //unlink之后再减1,此处我们改用fstat函数而非stat,因为unlilnk已经删除文件名,所以不可以通过 文件名访问,但是fd仍然是打开着的,文件内容还没有被真正删除,依旧可以使用fd获得文件信息。
执行步骤8,文件内容被删除。。。。
실례 분석:
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
int main()
{
int fd;
char buf[32];
struct stat buff;
if((fd=open("temp.txt",O_RDWR|O_CREAT|O_TRUNC,S_IRWXU))<0){
printf("create file error!
");
}
stat("temp.txt",&buff);
printf("temp.link=%d
",buff.st_nlink);
link("temp.txt","test.txt");
stat("test.txt",&buff);
printf("after link the tem.link =%d
",buff.st_nlink);
if(unlink("temp.txt")<0){
printf("unlink error !
");
}
stat("temp.txt",&buff);
printf("after unlink tem.link=%d
",buff.st_nlink);
if(write(fd,"temp",5)<0){
printf("write wrror!
");
}
if((lseek(fd,0,SEEK_SET))==-1){
printf("lseek error!
");
}
if((read(fd,buf,5))<0){
printf("read error!
");
}
printf("%s
",buf);
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
용감한 바로 가기 및 우분투 응용 프로그램안녕하세요 여러분, 이 기사에서는 모든 사이트에서 pwa를 생성하고 실행기 응용 프로그램으로 추가하는 방법을 설명하고 싶습니다. 일부 웹사이트는 PWA로 설치를 허용하지 않지만 유사한 애플리케이션을 원합니다. 1. ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.