프로그램 짤 때 다른 프로그램의 아웃풋을 인풋으로 가져오는 방법


밑에는 어떤 숫자를 던져주는 프로그램입니다. 파일 이름은 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로 할 생각입니다.


조회수 62


3 답변


http://tldp.org/LDP/lpg/node7.html

링크를 접속해서 학습해보세요.

  • 2018년 01월 11일에 작성됨

  • 저도 공부하고 싶지만 지금은 실무에 바로 써야해서요. 링크는 감사합니다.    Wooyong Han   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 
  • 2018년 01월 14일에 작성됨
    기계공학과에서 코딩을 배우고 있는 대학생입니다. 아직 부족한 실력이니 많이 도와주세요. 그리고 제가 도움 드릴 수 있는게 있으면 가능한 도와드리고 싶습니다.

  • 좋은 의견 감사합니다    Wooyong Han   2018.1.16 22:22     

구글링을 해보니 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년 01월 15일에 작성됨
    내공냠냠

  • 오호 이런 방법이 있었군요! 질문자는 아니지만 하나 배워갑니다.    정한슬   2018.1.15 18:30     
  • 파이프라는 키워드는 찾았었는데 쓰는 방법을 모르겠더라고요 감사합니다    Wooyong Han   2018.1.16 22:23     

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close