popen, fread

C & C++ 관련 : 2008. 11. 30. 10:58
반응형
전에 로봇 개발을 하는데
리눅스용 플래쉬 플레이어 라이브러리를 써야 하는 경우가 있었다.

그 플래쉬 플레이어와 메인프로그램 간에 fscommand로 메세지를 주고 받아야 했는데
그때는 라이브러리를 분석해서 프로그램에 합칠 여유가 없었기 때문에
fscommand를 쓸수가 없었다.

새로 받은 라이브러리는 그냥 실행파일 형태로 되어 있어서 플래쉬 재생은 시킬수 있었지만 내뱉는 메세지를 어찌 처리해야 할지를 몰랐다.
왠지 그 메세지를 이용할 수 있을것 같다는 생각이 들었지만 바쁜 개발 일정 때문에 그 기능을 그냥 포기하고 만들었었다.

지금 책을 뒤지다 보니 방법이 있네.
지금 보는 책은 옛날에도 한번 훑어본 책인데....
공부를 제대로 안한거지.... 쩝.




popen 은 command 를 shell을 가동시켜서 열고 pipe(2)로 연결한다. pipe 는 기본적으로 단방향으로만 정의 되어 있음으로, 읽기전용 혹은 쓰기전용 으로만 열수 있으며, type 로 정의된다. popen 은 command 를 실행시키고 pip 연결을 위해서 내부적으로 fork() 와 pipe() 를 사용한다.

command 는 실행쉘인 /bin/sh 에 -c 옵션을 사용하여서 전달되게 된다.

pclose(2) 함수는 종료되는 관련 프로세스를 기다리며 wait(2) 가 반환하는 것처럼 명령어의 종료 상태를 반환한다.

popen 은 실패할경우 NULL 을 반환한다. pclose 는 종료되는 관련 프로세스를 기다리며 명령어의 종료 상태를 반환한다. 에러가 발견될경우 -1 을 리턴한다.

popen 함수는 메모리 할당이 실패한다면, errno 를 설정하지 않는다. fork()나 pipe()에서 실패했을경우 적당한 errno 를 설정한다.

pclose()는 자식의 상태를 얻을수 없을경우 errno 를 ECHILD 로 설정한다.







realg@realg-desktop:~$ ./aaa
13
realg@realg-desktop:~$ cat DS.sh
#!/bin/sh

usage=`df -k $1 | /usr/bin/awk '{ rem = 0 }{ n += 1 }{ a = $3 }{ b = $4 } \
n == 2 { rem = int ( a / ( a + b ) * 100 ) ;print rem} \
END {}'`

        echo $usage

realg@realg-desktop:~$
반응형

'C & C++ 관련' 카테고리의 다른 글

숫자와 문자 사이 형 변환  (2) 2008.12.28
fprintf연습(표준에러_표준출력)  (0) 2008.11.03
[ANSI-C] __FUNCTION__ 을 바꾸자.  (0) 2008.10.23
Posted by Real_G