2012-11-20 3 views
3

C 프로그램에서 하나의 파일을 만들고 싶습니다. 내 C 바이너리에서 오랫동안 사용하고 싶습니다. 하지만 나는 그런 식으로 파일을 만들고 내 C 프로그램이 파일을 생성하고 잠금을 해제 할 때까지 (vim이나 다른 편집기를 사용하여) 아무 것도 열거 나 읽을 수 없도록 파일을 만들고 싶습니다. 미리 감사드립니다.C 프로그램을 사용하여 Linux에서 파일 잠금

+0

아래에 주어진나요 당신 [STFW] (http://www.google.com/search?ie=UTF-8&q=linux+mandatory+locking) 그런 다음이 열려있는 파일은 무리()를 사용하여 잠겨? –

+0

당신은 할 수 있습니다. (http://linux.die.net/man/2/fcntl), 당신은 [** SHOULD NOT **] (http://kernel.org/doc/Documentation/filesystems /mandatory-locking.txt). –

답변

2

Unix에서 필수 파일 잠금을 정의 할 수 있습니다. 그러나 필수 잠금을 유지할 수 있도록 파일 시스템을 (다시) 마운트해야합니다. 예 루트 파일을 다시 마운트하려면

(1), (루트로) 사용

echo "big secret" > locked_file 

3 우리는 노기를 설정해야합니다

mount -oremount,mand/
이제

2의 우리의 비밀 파일을 만들 수 있습니다 파일에 ID 및 비활성화 그룹 실행 권한 :

chmod g+s,g-x locked_file 

그리고 우리의 C 코드는 해당 파일을 잠 그려면 : 를 (코드는 읽기가 잠금이 해제 될 때까지) 지연

#include <fcntl.h> 
#include <stdio.h> 
#include <unistd.h> 

int main() { 

struct flock fl; 
int fd; 

fl.l_type = F_WRLCK; /* read/write lock */ 
fl.l_whence = SEEK_SET; /* beginning of file */ 
fl.l_start = 0;  /* offset from l_whence */ 
fl.l_len = 0;  /* length, 0 = to EOF */ 
fl.l_pid = getpid(); /* PID */ 

fd = open("locked_file", O_RDWR | O_EXCL); /* not 100% sure if O_EXCL needed */ 

fcntl(fd, F_SETLKW, &fl); /* set lock */ 

usleep(10000000); 

printf("\n release lock \n"); 

fl.l_type = F_UNLCK; 
fcntl(fd, F_SETLK, &fl); /* unset lock */ 

} 

더 많은 정보 http://kernel.org/doc/Documentation/filesystems/mandatory-locking.txt

0

에있을 것입니다 당신이 그것을 읽을 수있는 다른 터미널을 시도 할 수 있습니다, 파일을 고정하고, 잠시 동안 잠 계속됩니다 flock()을 사용하여 파일을 잠글 수 있습니다. 구문은

#include <sys/file.h> 
#define LOCK_SH 1 /* shared lock */ 
#define LOCK_EX 2 /* exclusive lock */ 
#define LOCK_NB 4 /* don't block when locking */ 
#define LOCK_UN 8 /* unlock */ 

int flock(int fd, int operation); 

첫 번째 파일은 fopen() 또는 open()을 사용하여 열 수 있습니다.

int fd = open("test.txt","r"); 
int lock = flock(fd, LOCK_SH); // Lock the file . . . 
// . . . . 
// Locked file in use 
// . . . . 
int release = flock(fd, LOCK_UN); // Unlock the file . . .