2017-01-20 15 views
-3

리눅스에서 동기화 문제에 대한 도움을 찾고 있습니다. 나는 초보자이며, 세마포어를 사용하여 동기화하는 방법을 실제로 이해하지 못한다고 생각합니다. 내 임무는 파일에 액세스하는 두 프로세스를 동기화하는 것입니다. 하나는 다른 프로세스의 FIFO에서 읽은 다음이 파일에 쓰고 다른 하나는 읽습니다. 내 코드에는 동기화가 없다는 것을 알고 있지만 어떻게해야하는지 전혀 모른다.리눅스 세마포어

코드 :

sem_t writer, reader; 
    void readFromFifoSendToFile(void) { 
     sem_init(&writer, 1, 1); 
     FILE *fp; 
     char buffer[100]; 
     FILE *file; 
     file = fopen("file", "w+"); 
     fclose(file); 

     while(1) { 
        sem_wait(&writer); 
        fp = fopen("fifo", "r"); 
        fscanf(fp, "%s", buffer); 
        fclose(fp); 
        file = fopen("file", "a+"); 
        fputs(buffer, file); 
        fclose(file); 
        sem_post(&writer); 
     } 
    } 

    void readFromFileAndPrint(void) { 
     sem_init(&reader, 1, 1); 
     FILE *fp; 
     char buffer[100]; 
     int counter = 0; 

     while(1) { 
        sem_wait(&reader); 
        counter++; 
        if(counter == 1) { 
         sem_wait(&writer); 
        sem_post(&reader); 
        fp = fopen("file", "r"); 
        fscanf(fp, "%s", buffer); 
        fclose(fp); 
        printf("%s", buffer); 
        sem_wait(&reader); 
        if(counter == 0) { 
         sem_post(&writer); 
        } 
        sem_post(&reader); 
     } 
    } 
+0

세마포어를 사용해야합니까, 아니면 [named pipess] (http://www.linuxjournal.com/article/2156)를 사용할 수 있습니까? – Soren

+1

학교 과제입니까? 동기화에 대한 강의가 빠졌습니까? 당신의 코스 문헌에 아무것도 없나요? 검색을 시도 했습니까 (수천 개의 예제와 튜토리얼이 그물 전체에 있습니다)? –

+0

@Soren 세마포어를 사용하지 않아도되지만 파일을 사용해야합니다. 나는 대답을 찾고자했지만 그 개념을 얻지 못했습니다. 저는 Java 녀석입니다.이 Linux 특성을 사용하지 않았습니다. 예, 학교 과제입니다. – voidmat

답변

1

귀하의 주요 문제는 어떻게 세마포어 작품의 개념과 관련이있을 것으로 보인다. 세마포어는 제작자와 소비자 사이의 신호로 가장 잘 보입니다. 제작자가 무언가를하면 세마포어에 신호를 게시하고 소비자는 신호를 게시 할 때까지 세마포어를 기다립니다.

따라서 사용자와 제작자간에 세마포어가 하나만 있어야합니다. 동기화를 위해이 세마포어를 공유해야합니다. 또한 세마포어는 아직 생성되지 않았으므로 값 0에서 시작해야합니다. 생산자가 세마포어에 게시 할 때마다 값이 1 씩 증가 할 때마다 생산자 게시와 값이 증가하여 하나가 될 때까지 값이 0이면 고객이 세마포를 기다릴 때 대기합니다. 생산자가 소비자보다 훨씬 빠르면 소비자가 생산자가 생산 한 단위와 동일한 크기로 생산량을 소비하는 한 세마포어의 가치는 올라갈 수 있고 둘 이상일 수 있습니다.

오류 처리를 추가하지 않고 오류 처리를 추가하는 것은이 범위를 벗어납니다. 스레드를 사용했지만 세마포를 공유 할 수있는 한 프로세스와 동일한 작업을 수행 할 수 있습니다 그들 사이

#include <semaphore.h> 
#include <pthread.h> 
#include <stdio.h> 
#include <unistd.h> 

sem_t thereBeData; 

void* readFromFifoSendToFile(void*) { 

    FILE *fp = stdin; 
    char buffer[100]; 
    FILE *file; 

    file = fopen("file", "a+"); 

    while(1) { 
     fscanf(fp, "%s", buffer); 

     fprintf(file,"%s\n",buffer); 
     fflush(file); 

     sem_post(&thereBeData); // signal the consumer 
    } 
} 

void* readFromFileAndPrint(void*) { 
    FILE *fp = 0; 
    char buffer[100]; 
    int counter = 0; 

    while(1) { 
     sem_wait(&thereBeData); // Waiting for the producer 

     if (!fp) fp = fopen("file", "r"); 
     fscanf(fp, "%s", buffer); 

     printf("%s\n", buffer); 
    }  
} 


int main(void) 
{ 
    pthread_attr_t attr; 
    pthread_t thread1; 
    pthread_t thread2; 

    sem_init(&thereBeData, 0,0); 
    pthread_attr_init(&attr);  
    pthread_create(&thread1, &attr, readFromFifoSendToFile, (void*)0); 
    pthread_create(&thread2, &attr, readFromFileAndPrint, (void*)0); 

    sleep(10); 
} 
+0

감사합니다. 정말 유용한 게시물입니다. :) – voidmat