2015-02-04 2 views
0

리눅스에서 두 개의 서로 다른 프로세스를 동기화하겠습니다. 두 프로세스 모두 한 프로세스가 동시에 사용할 수있는 장치에 액세스하려고합니다. 지금까지는 동기화를 위해 이름이 지정된 세마포어를 사용 중이 었으며 누군가가 현재 장치에서 작동중인 프로세스를 종료 할 때까지 제대로 작동하고있었습니다. 이 상황에서 세마포어는 공개되지 않아 세마포어/액세스 장치를 획득하려고 시도하는 모든 프로세스가 중단됩니다.리눅스에서 동기화, C/C++

이것은 뮤텍스가있는 Windows에서 간단하게 해결할 수 있습니다. 이 시스템에서는 스레드/프로세스가 종료 될 때 mutex라는 이름이 자동으로 해제됩니다.

Linux의 모든 의견 및/또는 솔루션에 감사드립니다. 사전에

감사합니다! 토레노

+0

를 원하시면 여기 내 코드는? 확실하게, 그것은 _some_ 시그널을 얻는다. (죽이지 않는 한, 리눅스가 어떻게 작동하는지 정확히 잊어 버리지 만, 경고없이 죽이는 것은 거의 불가능 해 보인다.) – Mawg

+1

C++에 대한 정보를 들어 본 적이 있나 RAII 관용어 http://stackoverflow.com/questions/ 2321511/what-is-means-by-resources-acquired-is-initialization-raii? 자동으로 원하는 것을 닫거나 놓는 데 도움이됩니다. –

+0

[Advanced Linux Programming] 읽기 (http://advancedlinuxprogramming.com/); ([man_overview (7)] (http://man7.org/linux/man-pages/man7/sem_overview.7.html), [flock (2)] (http : // man7. org/linux/man-pages/man2/flock.2.html) 등) .... –

답변

0

이전 의견에서 제안한 Tony D와 같은 flock을 사용하여이를 해결했습니다. 누군가가 리눅스 프로세스는 프로세스가 사망하더라도 WM_CLOSE의 동등하지 않음

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

class CriticalSection 
{ 
    private: 

     char fileName[FILENAME_MAX]; 
     int fileDescriptor; 


    public: 

     CriticalSection(const char *sectionName) 
     { 
      // Mark as not acquired 
      fileDescriptor = -1; 

      // Build file name path 
      snprintf(fileName, sizeof(fileName), "/tmp/.%s", sectionName); 
     } 

     ~CriticalSection() 
     { 
      // Release critical section on object deletion 
      release(); 
     } 

     void acquire() 
     { 
      // Test if section is already acquired 
      if(fileDescriptor != -1) 
       return; 

      // Acquire critical section 
      fileDescriptor = open(fileName, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR); 
      if(fileDescriptor != -1) 
       lockf(fileDescriptor, F_LOCK, 0); 
     } 

     void release() 
     { 
      // Release critical section 
      if(fileDescriptor != -1) { 
       close(fileDescriptor); 
       fileDescriptor = -1; 
      } 
     } 
}; 

int main() 
{ 
    // Create critical section 
    CriticalSection cs("myappname"); 

    // Enter crtitical section 
    cs.acquire(); 

    // Critical section code 
    printf("Critical section has been acquired successfully!\n"); 

    // Leave critical section 
    cs.release(); 
    return 0; 
} 

재미 되세요 :) 미래에 그것을 사용하는 Toreno

+0

물론 생성자의 마지막 줄에서 acquire() 함수를 호출하여 RAII를 제공하도록 간단하게 수정할 수 있습니다. – Toreno

+0

그리고'cs'가 스택에 있기 때문에 소멸자가 자동으로 호출되기 때문에 끝에'cs.release()'가 필요 없습니다. 이렇게하면'cs','printf' 및'return'을 생성하는 3 행만 남게되지만 컴파일러에서'unused variable' 경고를 받게됩니다. – Th30n

+0

정확히! 그건 좋은 지적이야. – Toreno