2016-12-07 2 views
0

나는 내가이 시나리오를 갖고있는 C 코드의 구현을 데OS 개념은 이러한 시나리오에서 더 나은해야하는

나는이 실행될 때, 이제 .. log.txt라는 파일에 지속적으로 기록 바이너리 code 동시에 터미널 2를 열고 동시에 log.txt 파일에도 쓸 이진 code 바이너리를 다시 실행하십시오.

나는 이것을 막고 싶습니다. 내 논리는 First Binary가 작동하고 log.txt 파일에 기록 할 때 이진 파일의 두 번째 실행 인스턴스도 log.txt에 기록해야하지만 방지되어야합니다. 내가 수행 할 수있는 옵션에는 어떤 것이 있습니까 이 ?

C 프로그래밍에서 세마포어를 사용할 계획입니다. 하지만 누군가 다른 옵션을 가지고 있다면 친절하게 알려주세요

+0

https://linux.die.net/man/2/flock은 사용하는 플랫폼에서 사용할 수있는 쉬운 옵션 중 하나입니다. – hyde

답변

0

FD를 모든 스레드와 공유하므로 파일 설명자를 보호하기 위해 스레드를 만드는 경우 세마포어 또는 뮤텍스를 취해야합니다.

fcntl()은 struct flock structure을 사용하여 파일 잠금을 정의하고 확인합니다.

주소 공간을 넘어 파일을 보호하려면 뮤텍스가 주소 공간을 초과하여 작동하지 않으므로 구조체 또는 세마포어를 사용해야합니다. 귀하의 참조를 위해, 내가 한 응용 프로그램을 썼습니다.

#include <stdio.h> 
#include <fcntl.h> 
#include <stdlib.h> 
#include <string.h> 

#define printf(x) printf("%s\n", x) 

int main(int argc, char *argv[]) 
{ 
    const char filepath[30] = "/Users/darthvader/testlock"; 
    struct flock *new_wt_lock = (struct flock *) malloc(sizeof(struct flock)); 
    FILE *fp; 

    memset(new_wt_lock, 0, sizeof(struct flock)); 
    new_wt_lock->l_type = F_WRLCK; 
    new_wt_lock->l_len = 0; 

    fp = fopen(filepath, "w+"); 
    if(fp == NULL) 
    { 
     perror("Error opening file for writing"); 
     exit(EXIT_FAILURE); 
    } 
    printf("Attempting to acquire write lock"); 
    if(fcntl(fileno(fp), F_SETLK, new_wt_lock) == -1) 
    { 
     printf("Unable to acquire lock"); 
     perror("error"); 
     exit(EXIT_FAILURE); 
    } 

    printf("Doing random shit..."); 
    sleep(25); 
    printf("Stopped doing random shit"); 

    if(fcntl(fileno(fp), F_UNLCK, new_wt_lock) < 0) 
    { 
     perror("Error releasing lock"); 
     exit(EXIT_FAILURE); 
    } 

    printf("Released Lock...Exiting"); 
}