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

조회수 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 
    
    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)