프로그램 짤 때 다른 프로그램의 아웃풋을 인풋으로 가져오는 방법
조회수 1484회
밑에는 어떤 숫자를 던져주는 프로그램입니다. 파일 이름은 getHits.sh이고요.
#!/bin/bash
# Print 32 bit random number
UPPERBIT=$RANDOM
LOWERBIT=$RANDOM
UPPERBIT=$(($UPPERBIT<<16))
SLEEPTIME=$(($RANDOM % 10))
SLEEPTIME=$(echo $SLEEPTIME/10 | bc -l)
sleep $SLEEPTIME
echo tsf0 : 0x1080 : $(($UPPERBIT+$LOWERBIT))
터미널에서 이 명령어를 쳐서 실행할 수 있습니다.
chmod +x getHits.sh
./getHits.sh
그럼 아래와 같이 결과가 나옵니다.
tsf0 : 0x1080 : 181882363
이 숫자를 인풋으로 하는 프로그램을 짜려고 하는데 시간 당 일정한 개수의 인풋이 들어오고 그것들의 평균을 구하는 함수를 만들어야 합니다. 시작부터 저 결과를 가져오는 난관에 막혔습니다. 작성은 크게 상관없지만 cpp로 할 생각입니다.
-
(•́ ✖ •̀)
알 수 없는 사용자
3 답변
-
구글링을 해보니 popen 함수를 쓰면 된다는 것 같습니다. 유닉스에서는 프로그램에서 표준 출력 장치로 출력한 내용을 다른 프로그램의 입력으로 전송할 수 있으며, 이를 파이프라고 한다고 합니다. (출처: falinux forum)
위 링크의 예제를 활용했을 시엔,
#include <stdio.h>
#define BUFF_SIZE 10
int main(void) {
char buff[BUFF_SIZE];
FILE *filepipe;
filepipe = _popen( "./getHits.sh", "r");
if (NULL == filepipe) {
perror("popen 실패");
return -1;
}
while( fgets(buff, BUFF_SIZE, filepipe) )
printf("%s", buff);
_pclose(filepipe);
return 0;
}
로 해보시면 될 것 같습니다. 함수/매크로/변수에 걸려있는 링크들 클릭하시면 Microsoft Visual Studio C++ 설명서의 해당 항목으로 이동합니다.
참고로 윈도우에서는 popen, pclose를 _popen, _pclose로 대체 해야한다고 하며, 파이프가 제대로 닫히지 않는 exception이 발생할 수 있다고 하니, try-catch문을 추가로 활용해야 하실 수도 있습니다. (출처: StackOverflow)
- 오호 이런 방법이 있었군요! 질문자는 아니지만 하나 배워갑니다. 알 수 없는 사용자 2018.1.15 18:30
- 파이프라는 키워드는 찾았었는데 쓰는 방법을 모르겠더라고요 감사합니다 알 수 없는 사용자 2018.1.16 22:23
-
http://tldp.org/LDP/lpg/node7.html
링크를 접속해서 학습해보세요.
- 저도 공부하고 싶지만 지금은 실무에 바로 써야해서요. 링크는 감사합니다. 알 수 없는 사용자 2018.1.11 16:17
- 실무에 쓰려면 뭘 알아야 쓰지 않겠어요? 나도 모르는 코드를 프로덕션에 사용하는 것 부터가 멀리 돌아가는 겁니다. 해당 문서가 IPC의 기본적인 사항만 예제로 축약해서 되어 있습니다. 정영훈 2018.1.11 18:41
-
야매이지만 이런 방법은 어떨까요? 우선 getHits.sh의 마지막줄을 다음과 같이 수정하고요.
echo $(($UPPERBIT+$LOWERBIT)) # echo tsf0 : 0x1080 : $(($UPPERBIT+$LOWERBIT))
system함수랑 터미널의 '>'명령을 사용해서 쉘스크립트의 출력을 txt파일로 저장하고 c언어의 파일 입출력 함수를 이용해서 txt파일로 저장된 내용을 다시 읽는거죠. 대충 만들어본 코드는 다음과 같습니다.
#include <unistd.h> #include <stdio.h> #include <stdlib.h> #define ITERATION 3 int main(int argc, char **argv) { int intinput; FILE *fp; char input[32]; for(int i = 0; i<ITERATION;i++) { if(system("/home/hansle/getHits.sh > /home/hansle/getHits.txt") != 0) return -1; fp=fopen("/home/hansle/getHits.txt","r"); fscanf(fp,"%d",&intinput); printf("%d: %d \n",i+1,intinput); fclose(fp); } return 0; }
뭐 야매죠;; 굳이 출력을 하드 쓰고 하드에 쓴걸 다시 읽고 그렇게 해야하까요;; 그래도 성능은 떨어져도 기능수행은 될거라고 생각합니다.
추가-출력 결과 입니다
1: 1671002997 2: 1552024643 3: 1917608459
-
(•́ ✖ •̀)
알 수 없는 사용자
-
댓글 입력