2013-04-18 4 views
4

많은 연결이있는 곳에 클라이언트 코드를 작성했습니다. 각 노드는 동일한 시스템에서 다른 프로세스를 나타냅니다. 그리고 그것을하기 위해 나는 분명히 fork()를 사용했다.리눅스에서 C 프로그램을 통해 새 터미널을 여는 방법

하지만 이제는 모든 결과가 동일한 터미널에 표시됩니다. 각 방법을 알고 싶습니다. 각 fork() 또는 프로세스 생성 새 터미널이 열리면 특정 터미널에서 해당 프로세스에 대한 모든 결과가 표시됩니다.

P.S : system("gnome-terminal")을 시도했지만 새로운 터미널을 열었지만 모든 결과가 동일한 터미널에만 다시 표시됩니다. 모든 새 터미널이 열리고 아무 결과도없이 공란으로 남습니다.

또한이 링크 How to invoke another terminal for output programmatically in C in Linux을 통과했지만 매개 변수 등으로 프로그램을 실행하고 싶지 않습니다. 그것은 ./test

여기 내 코드처럼해야한다 : -

for(int i=0;i<node-1;i++) 
    { 
    n_number++; 
    usleep(5000); 
    child_pid[i]=fork(); 
    if(!child_pid[i]) 
    { 
     system("gnome-terminal"); 
     file_scan(); 
     connection();   
     exit(0); 
    }  
    if(child_pid[i]<0) 
     printf("Error Process %d cannot be created",i); 
    } 
    for(int i=0;i<node-1;i++) 
    wait(&status); 

그래서 기본적으로 각 프로세스에 대해 무엇을 내가 원하는 해당 프로세스 정보 나 결과를 표시하는 새 터미널이 있어야합니다.

내가 정확히 원하는 것은 : 포크 후

  • 은() 내가 처리 한 후 나는 같은
  • 각 프로세스로가는 하나 개의 단자로 출력을 원하는 말을 관련 일부 데이터가 있습니다. 그래서 마치 3 개의 프로세스가 있다면 3 개의 터미널이 있어야하며 각 프로세스는 관련된 데이터 만 표시해야합니다.

IPC (Inter Process Communication)를 사용하여 수행 할 수 있지만 다른 방법이 있습니까? 나는 단지 2-3 명령 정도를 의미합니까? 왜냐하면이 부분을 코딩하는 데 너무 많은 투자를하고 싶지 않기 때문입니다.

미리 감사드립니다.

+0

어떻게 원래 프로세스가 터미널에 쓰기를 준비합니까? 새로운 단말기의 어떤 프로세스가 귀하가 작성한 정보를 표시합니까? –

+0

@JonathanLeffler 파일 설명자와 스트림을 더 기억하고 싶지만 이론적으로 새 터미널을 열고 해당 터미널에 대한 파일 설명자에 'stdout'을 리디렉션 할 수 없습니까? 흠 나는 내가 터미널을 오해하고 있다고 생각한다. – rliu

+1

나의 부재/기대는 그 밖의 것이 없다면, 터미널은 그 자신의 셸과 그 자신의 (깜짝) 터미널 ('/ dev/ttyXXX' 또는 '/ dev/ptyXXX'). 그래서,주의 깊게 배관하는 것이 필요하기 때문에, 터미널 창 입력은 여러분의 프로세스에서 쓰고 싶어합니다. 프로그램을 (아마도'cat'?) 입력해야합니다. 터미널 창. 나는 그것을하지 않았으므로 트릭이 무엇인지 알지 못합니다. ('man gnome-terminal'을 시도해 보셨습니까?) –

답변

5

어쩌면 당신은 그런 것을 원할 것입니다. 이 프로그램은 master와 slave 사이의 양방향 채널 인 unix98 pseudoterminal (PTS)을 사용합니다. 그래서, 각각의 포크에 대해, 당신은 새로운 PTS를 생성 할 필요가 있습니다. triad posix_openpt, grantpt, unlockpt를 마스터 측, ptsname을 슬레이브 측으로 호출해야합니다. 각 측의 초기 filedescriptors (stdin, stdout 및 sdterr)를 수정하는 것을 잊지 마십시오.

개념을 증명하는 프로그램 일 뿐이므로 어떠한 오류 검사도하지 않습니다.

#define _XOPEN_SOURCE 600 
#include <unistd.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <libgen.h> 
#include <string.h> 
#include <fcntl.h> 

int main() { 
    pid_t i; 
    char buf[10]; 
    int fds, fdm, status; 

    fdm = posix_openpt(O_RDWR); 
    grantpt(fdm); 
    unlockpt(fdm); 

    close(0); 
    close(1); 
    close(2); 

    i = fork(); 
    if (i == 0) { // father 
    dup(fdm); 
    dup(fdm); 
    dup(fdm); 
    printf("Where do I pop up?\n"); 
    sleep(2); 
    printf("Where do I pop up - 2?\n"); 
    waitpid(i, &status, 0); 
    } else { // child 
    fds = open(ptsname(fdm), O_RDWR); 
    dup(fds); 
    dup(fds); 
    dup(fds); 
    strcpy(buf, ptsname(fdm)); 
    sprintf(buf, "xterm -S%c/2", basename(buf)); 
    system(buf); 
    exit(0); 
    } 
} 
+0

'sprintf (buf, "xterm -S % c/2", basename (buf));는'char *'에 % s이어야합니다. –