2016-04-07 24 views
0

C'ye bir çağrı cihazı yerleştirmeye çalışıyorum, kodun başka bir terminal açmasını istiyorum (xterm) ve bazı çıktıları yazdırın.Xterm çağrı cihazı - iki terminal çıkışı - boru ve dup2 kullanarak

İlk önce bir program oluşturup ana programa çatal atıyorum, çocuk xterm'i kuyruk komutuyla yürütecek, ana program borunun içinde bir şeyler çıkaracak ve xterm'i çalıştırmadan önce çocuğu dupleks olarak çıkaracaksınız. çocuğun dosya tanıtıcısı.

Kodum çalışmıyor çünkü pipe ve dup2 kullanımını yanlış anlamış olabilirsiniz.

int p[2]; 
pipe(p); 
char buff[512]; 
switch (fork()) { 
    case -1: 
     fprintf(stderr, "Fork error.\n"); 
     break; 
    case 0: 
     dup2(p[0], 0); 
     close(p[0]); 
     close(p[1]); 
     execlp("xterm", "xterm", "tail", NULL); 
     break; 
    default: 
     scanf("%s", buff); 
     write(p[1], buff, strlen(buff)); 
     getchar(); 
     break; 
} 

Şimdilik ebeveyn için bir şey yazdım ve her iki işlemde de hiçbir şey yazdırılmıyor. Peki, xterm ile üst süreç arasında nasıl bir iletişim kurabilirim?

Düzenleme: programımın örnek değil: Genelde

#define VERBM_NOVERB 0 
#define VERBM_STDOUT 1 
#define VERBM_XTERMO 2 

static int fd_xterm = -1; 

void init_outputxterm() { 
    mkfifo("/tmp/mypipe", 0600); 
    switch (fork()) { 
     case -1: 
      fprintf(stderr, "Fork error.\n"); 
      break; 
     case 0: 
      execlp("xterm", "xterm", "-e", "/usr/bin/tail -f /tmp/mypipe", NULL); 
      printf("FAILURE\n"); 
      exit(EXIT_FAILURE); 
      break; 
     default: 
      if ((fd_xterm = open("/tmp/mypipe", O_WRONLY)) == -1) { 
       fprintf(stderr, "Can't open pipe"); 
       exit(1); 
      } 
      write(fd_xterm, "yayay\n", 6); 
      dprintf(fd_xterm, "Hello world\n"); 
      getchar(); 
      break; 
    } 
} 

void verbose_xterm(char *format, ...) { 
    dprintf(fd_xterm, BOLD UNDERLINED "verbose - " RESET); 
    va_list aptr; 
    va_start(aptr, format); 
    dprintf(fd_xterm, format, aptr); 
    va_end(aptr); 
} 


void verbose_stdout(char *format, ...) { 
    printf(BOLD UNDERLINED "verbose - " RESET); 
    va_list aptr; 
    va_start(aptr, format); 
    vprintf(format, aptr); 
    va_end(aptr); 
} 

void verbose_noverb(char *format, ...) { 
} 

void (*verbose)(char *format, ...) = verbose_stdout; 


void (*verbose_mode[])(char *, ...) = { 
    verbose_noverb, 
    verbose_stdout, 
    verbose_xterm 
}; 

void verbosity(int mode) { 
    if (mode == VERBM_XTERMO) 
     init_outputxterm(); 
    verbose = verbose_mode[mode]; 
} 

: verbose birkaç çağrı Ardından

verbosity(VERBM_XTERMO); 

. init_outputxterm 'da xterm' in oluşturulmasından hemen sonra, xterm 'den sonra, çözümde olduğu gibi yazmak için bir notta görebilirsiniz. Ama her şey programdan çıktıktan sonra programdan çıktıktan sonra ana terminalin çürümesini kapatarak, çocuk süreçlerini yetim haline getirerek (Ctrl-C numaralı çocuktan ayrılırsam da çocuk öldürüldü).

cevap

1

Xterm'in kendisi stdin'den okuma yapmıyor, bu nedenle veri beslemesinin bir etkisi olmayacak. Ama eğer bir adlandırılmış yöneltme açmaya ve bunun gibi mesela tail-f/ondan tmp/mypipe ile okuyabilir:

mkfifo("/tmp/mypipe", 0600); 
switch (fork()) { 
    case -1: 
     fprintf(stderr, "Fork error.\n"); 
     break; 
    case 0: 
     execlp("xterm", "xterm", "-e", "/usr/bin/tail -f /tmp/mypipe", NULL); 
     exit(EXIT_FAILURE); 
     break; 
    default: 
     ; 
     char buff[512]; 
     int fd = open("/tmp/mypipe", O_WRONLY); 
     scanf("%s", buff); 
     write(fd, buff, strlen(buff)); 
     getchar(); 
     break; 
} 

Bu adlandırılmış yöneltme /tmp/mypipe açılacaktır. Üst süreç, ona veri yazar ve xterm'deki tail -f-işlemi daha sonra çıkarır.

+0

Neden bilmiyorum ama xterm sadece bu kodla açılmıyor ve hemen kapanıyor ... –

+0

Belki de 'tail' yönteminin yolu farklıdır ya da '/ tmp/mypipe' borusu doğru bir şekilde oluşturulmamıştır. ? – Ctx

+0

Çalışıyor, teşekkürler! Bu sorun, pencere camı i3'ümden geldi, çünkü ana terminal yüzen modda başlatıldı ve i3 açılır pencerenin nasıl yönetileceğini bilmiyordu, ana terminali döşeme modunda çalıştırarak çözüldü. –

İlgili konular