Итак, вот мой код, который предназначен для открытия дополнительного терминала gnome и печати первых 20 чисел Фибоначчи в недавно открытой терминальной консоли:

#include <stdio.h>
#include "apue.h"

int Fibonacci(unsigned int n);

int main() {
    char cmd[256];
    char str[40][256];
    char *name = tempnam(NULL, NULL);
    char *line = "\n";
    FILE *log;

    mkfifo(name, 0777);
    log = fopen(name, "w+");

    for (unsigned int i = 0; i < 20; i++) {
         sprintf(str[(2 * i)], "%s",line);
         fputs(str[(2 * i)], log);
         sprintf(str[(2 * i) + 1], "%u\n", Fibonacci(i));
         fputs(str[(2 * i) + 1], log);
         fflush(NULL);
    }
    if (fork() == 0) {
        sprintf(cmd, "gnome-terminal -e cat %s", name);
        system(cmd);       
        for (unsigned int j = 0; j < 40 ; j++) {    
            fgets(str[j], sizeof(cmd), log);            
        }
        exit(0);
    } else
    if (fork() < 0) {
        perror("fork () error");    
    }
}

int Fibonacci(unsigned int n) {
    if (n == 0) {
        return 0;
    } else
    if (n == 1) {
        return 1;
    } else
    if (n > 1) {
        return Fibonacci(n - 2) + Fibonacci(n - 1);
    }
}

Когда я его компилирую, я получаю следующее предупреждение:

-*- mode: compilation; default-directory: "/usr/lib/gcc/x86_64-linux-gnu/4.8.4/include/" -*-
Compilation started at Sun Sep  3 15:46:28

gcc  -o FIB0   Fibonacci.c
/tmp/ccobnJV9.o: In function `main':
Fibonacci.c:(.text+0x231f): warning: the use of `tempnam' is dangerous, better use `mkstemp'

Compilation finished at Sun Sep  3 15:46:28

Когда я запускаю его из командной строки терминала gnome, новый терминал открывается, но с нет вывода! Как я могу исправить этот код, чтобы он работал?

Когда я использую

 sprintf(cmd, "xterm -e cat %s", name);

Вместо «гном-терминал» он работает правильно. Так как же общаться между терминалами GNOME, используя GCC?

1
SavedbyZer0 4 Сен 2017 в 01:51

4 ответа

Лучший ответ

Пытаться

sprintf(cmd, "gnome-terminal -e \"cat %s\"", name);

Gnome-терминал man запрашивает строку после -e.

0
Eduardo José Gómez Hernández 4 Сен 2017 в 00:40

Попробуйте это в командной строке.

Если я бегу

echo hi > ~/temp
gnome-terminal -e cat ~/temp

Затем я получаю терминал, работающий cat (который изначально пуст, пока я что-то не наберу и не нажму enter)

Если я бегу

xterm -e cat ~/temp

Затем я получаю xterm, который появляется, печатает «привет» и закрывается очень быстро.

Похоже, что gnome-terminal -e cat /some/path не работает cat /some/path, а только cat.

Если вы хотите запустить cat /some/path в терминале gnome, вам нужно использовать команду:

gnome-terminal -e "cat /some/path"

Обратите внимание на дополнительные кавычки.

0
user253751 3 Сен 2017 в 23:05

В вашем механизме разветвления есть дополнительная проблема:

if (fork() == 0) {
    /* do something in the child */
} else
if (fork() < 0) {   //<--- fork AGAIN!
    perror("fork () error");    
}

Родительский процесс разветвляется дважды!

Вместо этого вы должны хранить pid:

int pid = fork();
if (pid == 0) {
    /* do something in the child */
} else
if (pid < 0) {
    perror("fork () error");    
}
1
chqrlie 4 Сен 2017 в 00:29

Либо используйте цитаты, как предложил immibis, либо используйте -x вместо -e. Смотрите man-страницу gnome-terminal для подробностей.

0
deamentiaemundi 3 Сен 2017 в 23:16