2012-06-25 5 views
2

는 (몇 사람이 중요한 제한 사항을 누락하는 것 때문에) 다른 프로그램을 수정할 수없이 다른 C++ 프로그램에 데이터를 보낼 수 있습니까? 그렇다면 어떻게해야할까요? 현재 방법은 임시 파일을 만들고 파일 이름을 매개 변수로 사용하여 다른 프로그램을 시작하는 것입니다. 유일한 문제는 나중에 임시 파일을 정리하여 나중에 정리하는 것입니다.이 파일은 필요하지 않습니다.다른 C++ 프로그램에 데이터를 보내기

편집 : 또한 부스트는 이 아니며 옵션입니다.

+1

수의 입력 파일로 다른 프로그램을 사용 표준 입력 : 여기 예로서

는 세계 안녕하세요 2.0? 그렇다면 아마도 파이프 만 통과 할 수 있습니다. –

+1

시스템에서 사용할 수있는 다양한 [IPC] (http://en.wikipedia.org/wiki/Interprocess_communication) 메커니즘에 대해 읽었습니까? – dirkgently

+0

@FredLarson 나는 그렇게 생각하지 않는다. 나는 * only *가 파일 이름을 시작 매개 변수로 취한다고 믿는다. – Drise

답변

4

두 번째 프로그램이 지원하는 경우 stdin에 파이프를 작성하는 것이 좋습니다. Fred가 주석에서 언급했듯이 많은 프로그램은 제공된 파일이 없거나 -이 파일 이름으로 사용되는 경우 stdin을 읽습니다. 이 파일 이름을 취해야합니다, 당신이 리눅스를 사용하는 경우

,이 시도 : 파이프를 작성하고, 명령 행에 /dev/fd/<fd-number> 또는 /proc/self/fd/<fd-number>를 전달합니다.

#include <string> 
#include <sstream> 
#include <cstdlib> 
#include <cstdio> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 

int main() { 

    int pfd[2]; 
    int rc; 

    if(pipe(pfd) < 0) { 
    perror("pipe"); 
    return 1; 
    } 

    switch(fork()) { 
    case -1: // Error 
    perror("fork"); 
    return 1; 

    case 0: { // Child 
    // Close the writing end of the pipe 
    close(pfd[1]); 

    // Create a filename that refers to reading end of pipe 
    std::ostringstream path; 
    path << "/proc/self/fd/" << pfd[0]; 

    // Invoke the subject program. "cat" will do nicely. 
    execlp("/bin/cat", "cat", path.str().c_str(), (char*)0); 

    // If we got here, then something went wrong, then execlp failed 
    perror("exec"); 
    return 1; 
    } 

    default: // Parent 
    // Close the reading end. 
    close(pfd[0]); 

    // Write to the pipe. Since "cat" is on the other end, expect to 
    // see "Hello, world" on your screen. 
    if (write(pfd[1], "Hello, world\n", 13) != 13) 
     perror("write"); 

    // Signal "cat" that we are done writing 
    close(pfd[1]); 

    // Wait for "cat" to finish its business 
    if(wait(0) < 0) 
     perror("wait"); 

    // Everything's okay 
    return 0; 
    } 
} 
+0

후자의 예를 들어 주시겠습니까? – Drise

+0

최근 편집을 참조하십시오. –

+0

좋아 보인다. 감사. – Drise

1

소켓을 사용할 수 있습니다. 두 응용 프로그램이 같은 호스트에있는 것처럼 들리므로 피어를 localhost : portA 및 localhost : port B로 식별하면됩니다. 이렇게하면 네트워크 IO를 수행하도록 결국 졸업 할 수 있습니다. 임시 파일, 신비한 구문 분석 오류 또는 파일 삭제가 없습니다. TCP는 패킷 전달을 보장하고 패킷이 올바르게 주문됨을 보장합니다.

그럼, 동기식 소켓 서버를 만드는 것을 고려해 볼 것입니다. (피어 톤이 많은 경우 비동기를 사용하십시오.) 파이프 지향 IPC에 비해 한 가지 이점은 TCP 소켓이 완전히 보편적이라는 것입니다. 파이프는 극적으로 당신이 어떤 시스템에 있는지에 따라 다릅니다 (Windows 명명 된 파이프와 암시 적 및 명시 적 POSIX 파이프 -> 매우 다른 것을 고려하십시오).

+2

보조 프로그램을 수정해야하는 이유는 무엇입니까? – Drise

+0

있습니다. 네가 두 출처에 대한 통제권을 갖고 있다고 생각 하나? – kmarks2

+0

* 다른 프로그램을 수정할 수 없다 * 아니요, 아닙니다. – Drise