2013-07-31 5 views
3

리눅스에서 직렬 포트에 관한 문제를 해결하려고합니다. 포트를 열어서 읽고 닫을 수 있습니다. 그러나 나는 언제나 항구에서 독서/글을 쓰는 유일한 사람이다.리눅스 직렬 포트 잠그기

open() 함수를 호출 한 후에이 작업이 이미 완료되었다고 생각했습니다. 그러나, 내 프로그램의 동일한 포트에서 open()을 여러 번 호출 할 수 있습니다. 또한 같은 포트에서 동시에 읽는 두 개의 스레드를 가질 수 있습니다.

flock()을 사용하여이 문제를 해결했지만 여전히 동일한 문제가있었습니다. 두 시스템 호출이 같은 pid에서오고 있기 때문입니다. 비록 열 및 읽기의 각 집합과 관련된 다른 파일 설명자가 있습니까? 레코드의 경우 open() 호출은 유효한 파일 설명자를 반환합니다.

결과적으로 문제로 해결할 수있는 방법이 있는지 궁금합니다. 프로그램의 관점에서 보자면, 같은 포트에서 두 번의 open() 호출이 성공하면 큰 문제가되지 않습니다. 왜냐하면 프로그래머는 자신이 일으키고있는 우스꽝스러운 점을 알고 있어야하기 때문입니다. 그러나 포트를 열면 해당 포트에 액세스 할 수있는 유일한 프로세스라는 사실을 알고 싶습니다.

도움 주셔서 감사합니다.

+0

Linux에서 직렬 포트 및 기타 장치를 잠 그려면 [ "모범 사례"방법에 관한 질문] (http://stackoverflow.com/questions/30316722/what-is-the-best-practice- Linux 용 직렬 포트 및 기타 장치). –

답변

10

리눅스에서, 당신은 (그들이 errno==EBUSY, 장치 또는 리소스 바쁜으로 -1를 돌아갑니다) 성공하는 장치에 다른 open()의를 중지 TIOCEXCL TTY ioctl을 사용할 수 있습니다. 이는 터미널 및 직렬 장치에서만 작동하지만 권고 잠금에 의존하지 않습니다. 예를 들어

:이 도움이

#include <unistd.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <sys/ioctl.h> 
#include <termios.h> 
#include <fcntl.h> 
#include <errno.h> 

int open_device(const char *const device) 
{ 
    int descriptor, result; 

    if (!device || !*device) { 
     errno = EINVAL; 
     return -1; 
    } 

    do { 
     descriptor = open(device, O_RDWR | O_NOCTTY); 
    } while (descriptor == -1 && errno == EINTR); 
    if (descriptor == -1) 
     return -1; 

    if (ioctl(descriptor, TIOCEXCL)) { 
     const int saved_errno = errno; 
     do { 
      result = close(descriptor); 
     } while (result == -1 && errno == EINTR); 
     errno = saved_errno; 
     return -1; 
    } 

    return descriptor; 
} 

희망.

0

flock() 함수를 사용하여이 문제를 해결할 수있었습니다. 어떤 이유로 든 구조체와 fcntl()을 사용하지 못했습니다. flock()을 사용하여 두 줄의 코드를 추가하고 문제를 해결할 수있었습니다.

+1

당신의 질문에 당신이'flock()'을 사용하려했으나 제대로 작동하지 않는다고 대답했기 때문에이 대답은 혼란 스럽습니다. 이제 여기에'flock()'이 해결책이라고 말하는 것입니다. 뭐? –

+0

원래의 질문에서'fcntl()'이'flock()'이 아니라'fucknt()'가 작동하지 않았을 가능성이 있습니까? –