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ü).
Neden bilmiyorum ama xterm sadece bu kodla açılmıyor ve hemen kapanıyor ... –
Belki de 'tail' yönteminin yolu farklıdır ya da '/ tmp/mypipe' borusu doğru bir şekilde oluşturulmamıştır. ? – Ctx
Ç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ü. –