2012-06-12 4 views
6

필자가 작성한 프로그램에서 비동기 작업을 처리하는 방법을 잘 모르겠다. 적어도 경험이 많은 사람이 적어도 올바른 방향으로 나를 가리킬 수 있기를 바란다.리눅스에서의 병렬 처리

임베디드 ARM 프로세서에서 Angstrom Linux를 실행 중입니다. 내 프로그램은 노출 된 하드웨어 PWM과 PTP를 통한 카메라를 통해 여러 서보를 제어합니다. 또한 임의의 클라이언트 (이 경우에는 Android)로부터 명령을받는 소켓 데몬입니다. 카메라 PTP는 속도가 느리기 때문에 프로그램의 나머지 부분이 응답해야하기 때문에 작업을 마칠 때까지 기다릴 필요가 없습니다.

스레드를 사용해 보았지만 카메라 스레드의 문제로 인해 전체 프로세스가 중단 된 것 같습니다. 이상적으로는 카메라를 자체적으로 꺼내서 카메라로 보내고 싶으면 끝내면 주 기능을 알 수 있습니다. 이것은 적절한 포크 기법입니까 아니면 부적절하게 스레딩을 구현 했습니까?

또한, 그때 나는 이미 더 이상 크로스 컴파일 문제를 피하기 위해 큰 차 라이브러리를 멀리하고 싶습니다. 제안에 대해 미리 감사드립니다.

+2

왜 새 프로세스에서 실행하지 않습니까? 그런 다음 소켓을 통해 통신 하시겠습니까? – Hassan

+0

고급 Linux 프로그래밍을 가이드로 사용했지만 clone() 함수를 다루지 않습니다. 적절한 기술로 보입니다 –

+0

수 있습니다. 아니면 [system()'] (http://www.cplusplus.com/reference/clibrary/cstdlib/system/) 일 수 있습니다. 저것을 한번보세요. – Hassan

답변

1

steveha의 대답은 기본 방법이지만 init (8) 및 명명 된 파이프는 건너 뜁니다.

fork() 카메라 코드를 포함하고 정기적으로 파이프 나 도메인 소켓을 통해 통신 아이. 부모의 SIGCHLD에 대한 신호 처리기를 코드화하십시오. 자식이 사망하면 이유 코드가 wait()에서 반환됩니다. 그것이 자체적으로 죽은 다음 정리하고 다시 시작하면; 그것이 정상적으로 끝나면 그 경우에 적절한 것이 무엇인지를 결정하십시오. 어떤 IPC를 선택 하든지간에 의사 소통을하십시오. 이렇게하면 init보다 자식을 더 잘 제어 할 수 있으며 특히 도메인 소켓이나 파이프는 FIFO의 펑키 의미 체계를 망치는 것보다 부모와 자식 간의 설정과 통신을 더 쉽게 만듭니다. 정말 카메라 코드에 문제가있는 경우 물론

, 당신은 정말 할 모든 전체 프로그램을 복용하지 않음으로써 실패가 좀 더 관리 할 수 ​​있도록합니다. 이상적으로 카메라 코드가 귀하의 능력을 발휘한다면 완벽하게 작동하도록해야합니다.

+0

카메라 코드가 작동합니다 ... 단어를 잘못 선택했습니다. 예를 들어 카메라가 연결되어 있지 않으면 카메라 스레드가 반환되고 어떤 이유에서든 프로그램의 세그먼트 오류가 발생합니다. clone() 함수에 대한 귀하의 의견은 무엇입니까? –

+0

클론은 당신을 위해 아무 것도하지 않을 것입니다. 스레드와 포크는 모두 복제를 둘러싼 래퍼입니다. 문제가있는 경우 레벨을 낮추면 문제가 해결되지 않습니다. 아마도 다른 질문에 스레드 코드의 기초를 게시해야합니다. 아주 간단한 오류 일 수 있습니다. – Duck

+0

도움을 주신 모든 분들께 감사드립니다. 간단한 파이프로 포크를 사용하고 내가 바라는대로 모든 것이 작동합니다. 나는 시그널 핸들러가 자식 프로세스의 상태를 발견하는 것을 좋아한다. –

3

문제는 여러 프로세스의 일반적인 경우처럼 들리는데, 어떤 종류의 프로세스 간 통신 (IPC)과 통신합니다.

카메라는 자체 프로세스가 있어야하고, 그 프로세스가 죽으면, 주요 프로세스는 문제가 안된다. init(8) 프로세스에서 카메라 프로세스를 관리 할 수도 있습니다. 그것은 어떤 이유로 든 죽으면 자동으로 프로세스를 재시작 할 수 있습니다.

당신은 영구적으로 명명 된 파이프를 설정할 수 있습니다, 후 카메라 프로세스는 다시 열 수 그것은 그것이 실패 후 다시 시작 언제든지.

http://en.wikipedia.org/wiki/Named_pipe

I에 유래를 검색하고 대 명명 된 파이프의 토론을 발견 http://www.tldp.org/LDP/lpg/node15.html

내가 위키 백과 페이지에서 이걸 발견 : 여기

명명 된 파이프에 대한 몇 가지 문서입니다 소켓 :

IPC performance: Named Pipe vs Socket

+0

유닉스와 윈도우 문서는 유닉스 파이프에 대해 잘못 알고있다. 'popen'은 시스템 호출이 아니며, 파이프는 2-way (리눅스 파이프는 아닙니다)로 보장되지 않으며'mknod'는이 문서가 오도하는 주장처럼 파이프가 아닌 특별한 파일을위한 것입니다. – Dave

+0

와우, 빠른 Google 검색의 위험을 보여 주며 문서를 빠르게 감추고 있습니다. 나쁜 링크를 게시하는 것에 대해 사과드립니다. 지금 내 대답에서 편집 해 보겠습니다. – steveha

+0

도움을 주셔서 감사합니다. –

0

스레드를 사용해 보았지만 카메라 스레드의 문제로 인해 전체 프로세스가 중단 된 것으로 보입니다.

전체 프로세스를 중단한다고 말하면 실제로 어떻게됩니까?

위의 문제를 디버깅하는 것이 좋겠다. 갈래로 치는 과정에서 버그를 없애는 것이 좋습니다. 신뢰할 수없는 카메라를 가진 신뢰할 수있는 핵심 시스템보다 신뢰할 수있는 카메라를 포함한 신뢰할 수있는 시스템을 보유하게됩니다.

+0

a return 0; 세그먼트 오류가 발생했습니다. –

+0

@CountZero : 그러면 gdb가 스택에 무엇을 말합니까? seg 오류의 원인은 무엇입니까? –