2014-03-13 1 views
0

저는 C++로 제작하고있는 임베디드 리눅스 프로젝트가 있습니다. 아치는 팔이고 프로세서는 프리 스케일 imx6입니다. ("alsasink 장치 = ossmix" "&"파일 이름 "// %의 오디오 싱크 = GST-발사 playbin2의 URI = 파일", sysdev) 의 sprintf를 :C++ 앱 내에서 마지막 배경 pid를 결정하십시오.

내가 사용하여 백그라운드에서 여러 오디오 파일을 실행하고 ; 다음에 의해 실행 : 시스템 (sysdev) 나는 또한 execvp를 사용하여 시도했다.

결과를 읽은 후 : $!

이 모두는 콘솔에서 잘 작동하지만 C++ 프로그램에서는 $! 결과를 반환하지 않습니다. 실제로 사용합니다 : echo $! &> result.dat를 사용하여 결과를 프로그램 내에서 읽은 파일로 파이프합니다. 문제는 프로그램 내에서 result.dat는 결코 데이터를 얻지 못한다는 것입니다. 아무것도 반환하지 않습니다.

제 생각에는 환경과 관련이 있습니다.

먼저 내 접근 방식을 사용할 수 있습니까?

나는 리눅스에 상당히 익숙하지만, 이해할 수있는 것은 내가 실행하는 프로그램에 PID를 발행 할 수 없다는 것이다. 나의 유일한 선택은 그들이 일어날 때 주어진 것들을 알아내는 것이다.

2 개의 동일한 사운드가 두 번 실행될 가능성이 있기 때문에 ps의 결과를 스캔하는 것만으로 충분하지 않습니다.

미리 양해 해 주셔서 감사합니다. 크리스

업데이트 : 나는 그것을 얻었다. 나는 fork()를 사용했고 자식에서는 단순히 execlp()를 호출했습니다. 상위 항목에서 하위 PID를 기록했습니다. 마지막으로 waitforpid (WNOHANG)를 사용하여 모든 포크의 상태를 모니터링하여 정보를 업데이트하는 스레드를 만들었습니다.

+0

[고급 Linux 프로그래밍] (http://advancedlinuxprogramming.com/) 읽기; 프로세스에 관한 좋은 장을 가지고 있습니다. –

답변

1

$!은 동일한 쉘이 나중에 $!을 평가할 프로그램으로 시작할 때만 작동합니다. system을 사용할 때마다 자체 쉘이 호출됩니다. 매뉴얼 페이지에서 :

system()/bin/sh -c command를 호출하여 명령에 지정된 명령을 실행하고 명령 후 반환이 완료되었습니다.

여기서 잘못된 접근 방식을 사용하고 있습니다. 대신 fork()exec 제품군의 기능 중 하나와 wait을 사용하는 방법을 배우십시오. fork()은 올바른 PID를 제공합니다.

+0

좋아,하지만 원래의 사운드 플레이어와 $! 내 프로그램에서, 그것은 같은 쉘로 간주되지 않겠습니까? fork()에 관해서는, 내 프로그램의 완전한 메모리 복사본을 만들었 기 때문에 사용하기가 다소 어려웠습니다. 특히 과도하게 세금을 부과하는 것처럼 보였습니다. 특히 여러 포크를 실행하고 임베디드 시스템에서 실행하는 것 같았습니다. 이 잘못 보는거야? – user3417173

+1

'system '을 사용할 때마다 자체 쉘이 호출됩니다. 더 많은 정보로 질문을 수정합니다. – abligh

+0

그리고 물론'system'은'/ bin/sh'의'fork'와'execve'를합니다. –