기능 깊이 탐사 리눅스 --open 기능은 파일의 파일 내용을 엽니 여부 메모리 공간에로드됩니다

전송 : HTTPS : //blog.csdn.net/qq_17019203/article/details/85051627

 

문제점 : 파일의 내용을 메모리 공간에 적재되면 오픈 (2) 함수는 파일을 여는

첫째, 파일 기술자 fd를해야합니다 파일을 열고, 파일 기술자 실제로 PCB 파일 디스크립터 테이블에 기록되고, 이것은 기본적으로 열려있는 파일과 관련된 정보를 저장하는 데 사용되는 파일 기술자 구조 이 전제를 기반으로, 나는이 가정을했다

1, 하드 디스크 파일에 저장된 해당 주소 정보 만 파일 기술자 구조, 파일 내용이 메모리에로드 될 수 없습니다, 이렇게의 장점은 차지하는 메모리 공간을 줄일 수 있지만 크게 (CPU의 실행 시간을 증가 NS에 대한 속도 데이터 액세스 메모리 레벨 60000ns 대한 하드 디스크 CPU 데이터 액세스 속도).

 

2, 문서의 내용을 저장하는 메모리 주소 공간에 파일 할당 구조에 대한 파일 기술자는 이렇게의 이점은 동작 속도가 낮은 파일이 메모리 공간까지 너무 심각 걸릴 인 경우보다 증가시키는 것이다.

 

질문 2 올바른 또 다른 문제가 발생하면 3. 규칙은 어떤 크기와이 주소 공간의 분포?

다음은 내 탐사 과정과 코드

단계 : I 파일을 열 (2) 기능을 열고 파일을 읽어 연속적 제공 3초의 판독 간격.

단계 : 독서의 과정에서, 나는 (rm 명령으로 삭제 다른 떠들썩한 파티를 엽니 다) 전체 파일 삭제를 읽을 수 없습니다

#INCLUDE <STDIO.H>
사용법 #include <unistd.h>
#INCLUDE <SYS / types.h>
#INCLUDE <SYS / stat.h>
#INCLUDE <fcntl.h>

INT 본체 (INT는 argc, * CHAR는 argv [] )
{
INT가 fd와;
숯 BUF [128];
INT read_size, write_size;
// 읽기 및 쓰기 파일을 열
FD = 개방 (는 argv [1], O_RDWR);
경우 (FD == -1)
{
perror는 ( "개방");
1을 반환;
}
동안 (1)
{
read_size 판독 = (FD, BUF, 2);
(read_size == 0) 어기면;
쓰기 (1 BUF, read_size);
수면 (3);
}
// 가까운 FD에
가까운 (FD)를;
0을 반환;
}
下面是运行结果:

배쉬 1

[일 @ 로컬 호스트 file_func] $ ./a.out 헬로
#INCLUDE <STDIO.H>
사용법 #include <unistd.h>

int 주 (int argc, 문자 *는 argv [])
{
INT의 link_flag;
link_flag = 링크 (는 argv [1]는 argv [2]);
경우 (link_flag == -1)
{
perror는 ( "링크");
1을 반환;
}
경우 (link_flag == 0)
의 printf ( "CREAT 하드 링크 성공 ... \ n");

0을 반환;
}
배쉬 2

[태양 @ localhost를 file_func] RM $ 안녕하세요
우리가 파일이 검사되지 않은 경우 파일을 삭제하고 독서 프로그램이 파일 내용을 읽을 계속 영향을주지 않습니다, 위의 결과로 볼 수있다

결론 1 : 오픈 (2) 함수는 파일의 파일 콘텐츠를 개방 메모리 공간으로로드 될

우리가 탐구하려는 옆에있는 주소 공간 할당의 최대 크기는 다른 결과 및 기타 문제가 발생합니다 다른 파일 형식의 번호입니다

 

그는 추가 :

파일을 삭제하면 파일을 실행하지만 RM 원칙과 링크 해제가 동일 할 가능성이있는 위의 실험 (즉 RM은 링크 해제 패키지), 프로그램에 대한 대기가 완료 파일 삭제 (차단, 삭제) 할 때까지 실행 나중에,하지만 한 링크 해제 파일의 구현이 즉시 사라 볼 (사라 할 수있는 시스템 인터페이스에,하지만 하드 디스크에 여전히있다)하므로

RM은 링크 해제 패키지를 탐구하기 위해 나는 다음과 같은 한을 통해 아닙니다

첫째, rm 명령을 사용하여 가상 이미지를 만들

둘째, 시스템은 strace를 명령으로 RM 실행이 호출되는 다음 명령을 받고 생성

strace를 -f -F -o ./log.txt의 a.out
 셋째, 여부 일부 시스템에서 보면 링크 해제 함수를 호출

#INCLUDE <STDIO.H>
사용법 #include <unistd.h>
#INCLUDE <SYS / types.h>
#INCLUDE <SYS / wait.h>

INT 본체 (무효)
{
된 pid_t PID;
// CREAT 자식 프로세스
PID = 포크 ();
경우 (PID == -1)
{
perror는 ( "포크");
1을 반환;
}
// 자식 프로세스
의 경우 PID (== 0)
{
// 메모리로드
INT ex_flag = 때 execlp ( "/ 빈 / RM ','RM ','안녕하세요 ', NULL);
경우 (ex_flag == -1)
{
perror는 ( "때 execlp");
2를 반환;
}
0을 반환;
}
// 아버지 공정
다른
{
대기 (NULL);
}

0을 반환;

mmap에 (0x3f02d8e000, 18600은 PROT_READ가 | PROT_WRITE가 MAP_PRIVATE가 | MAP_FIXED가 | MAP_ANONYMOUS, -1, 0) 0x3f02d8e000 =
13,697 확대 (3) = 0
13,697를 mmap (NULL, 4096, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0) = 0x7f0665bb5000
13,697의 mmap (NULL, 4096, PROT_READ가 | PROT_WRITE가 MAP_PRIVATE가 | MAP_ANONYMOUS, -1, 0) 0x7f0665bb4000 =
13,697의 mmap (NULL, 4096, PROT_READ는 | PROT_WRITE는 MAP_PRIVATE는 | MAP_ANONYMOUS는, -1, 0) 0x7f0665bb3000 =
13,697 arch_prctl (ARCH_SET_FS을 , 0x7f0665bb4700)는 0 =
13,697 mprotect는 (0x3f02d89000 16384, PROT_READ) = 0
13,697 mprotect는 (0x3f0241f000, 4096, PROT_READ) = 0
13,697 munmap은 (0x7f0665bb6000, 51,177) 0 =
13,697 BRK (0) 0x187b000 =
13,697 BRK (0x189c000) = 0x189c000을
13,697 개방 ( "는 / usr / lib 디렉토리 / 로케일 / 로케일 아카이브", O_RDONLY) = 3
13697 함수 fstat (3, {된 st_mode = S_IFREG | 0644, st_size = 99158576, ...}) 0 =
13697의 mmap (NULL, 99,158,576을, PROT_READ, MAP_PRIVATE, 3, 0) 0x7f065fd22000 =
13,697 확대 (3) = 0
13,697 IOCTL (0 SNDCTL_TMR_TIMEBASE 또는 TCGETS {B38400 opost ISIG ICANON 에코 ...}) 0 =
"안녕하세요"{된 st_mode, 13,697 newfstatat (AT_FDCWD을 S_IFREG = | 0666, st_size = 0, ...} AT_SYMLINK_NOFOLLOW) = 0
13,697 geteuid () = 500
13,697 newfstatat (AT_FDCWD, "안녕하세요"= {된 st_mode S_IFREG | 0666, st_size = 0, ...} AT_SYMLINK_NOFOLLOW ) 0 =
13,697 faccessat (AT_FDCWD)이 W_OK, "안녕하세요", 0 =
13,697 unlinkat (AT_FDCWD는 '안녕하세요', 0) 0 =
13,697 확대 (0) = 0
13,697 가까이 (1) = 0
13,697 닫기 (2) = 0
Exit_group 13697 (0) =?
13,696 NULL, 0, NULL) = 13,697 <... 만일 wait4 재개>
13696을 --- SIGCHLD (하위 계간) @ 0 (0) ---
13696 exit_group (0) =?
우리는 볼 수 있습니다 8 unlinkat 끝에서 두 번째 라인은 시스템 호출 함수, 함수 정의 unlinkat있을 때, 세번째 파라미터 등가 unlinkat 연결 해제 0 걸린다.

 

위의 분석을 통해, 나는 다음과 같은 결론을 가지고 :

파일을 열 때 1, 개방 (2) 함수는 파일의 내용이 메모리 공간에로드되어 있는지 여부를 파일이 메모리에로드 될 때 주소 리눅스 파일의 내용을 읽고 이론 교사 학습의 시간에, 현재를 알 수있는 방법이 없으며, 비 종이의 내용.

2, 그들은 읽기를 계속 할 수있는 파일에서 읽은 후 open 함수는 파일을 열 수 있도록, 삭제하기 때문에보기의 주관적 시점의 첫 번째 실험 결과는 메모리 공간에 파일 내용을로드하는 것입니다.

     그러나 객관적인 분석을 통해, 우리는 "이 아닌 시스템 인터페이스 디스플레이에서 삭제 될 RM 파일 삭제."우리가 생각하는 것을 발견 RM 삭제 파일 시스템 기능 unlinkat 호출되기 때문에이 개념은 파일 읽기가 너무 있지만, 잘못 우리가 시스템에 표시되는 파일을 읽어 볼 수 없습니다되는 시간이 걸리지 만 파일이 읽기 완료에 의해 읽기 전용 파일이 여전히 하드 디스크에 존재하는이 시간이 정말 삭제됩니다.
----------------
면책 조항 :이 문서는 CSDN 블로거 '가상 깊은 신비 "원래 기사 따르는 CC 4.0 BY-SA 저작권 계약입니다, 복제, 원본과 링크를 첨부하시기 바랍니다 이 문장.
원본 링크 : HTTPS : //blog.csdn.net/qq_17019203/article/details/85051627

추천

출처www.cnblogs.com/x_wukong/p/12059490.html