LINUX.ORG.RU

Из мана popen ---

The pclose function waits for the associated process to terminate and returns the exit status of the command...

те pclose(gp) ждет завершения дочернего процесса (пока окно gnuplot не закроешь программа дальше исполнатся не будет).

man fork man pipe man popen man pclose man exec

guardian
()
Ответ на: комментарий от ananas

Не понял...

popen возвращает FILE *. Для скармливания poll-y я делаю ufds.fd=fileno(gp);

Он в мане описан как
struct pollfd {
int fd; /* file descriptor */
short events; /* requested events */
short revents; /* returned events */
};

alexru ★★★★
() автор топика
Ответ на: комментарий от alexru

Да и все работает по идее. На предыдущих вызовах оно блокируется, но например на POLLOUT нет, так как канал свободен для записи, что и ожидалось.

Просто похоже не предназаначена функция poll для этого.

alexru ★★★★
() автор топика
Ответ на: комментарий от alexru

ну да, я и имел в виду fileno (уставший просто, перепутал)
с xterm работает на ура

(victor@pts/1)~ $> cat test.c                                             [sh]
#include <sys/poll.h>
#include <stdio.h>

int main ()
{
  FILE *fd;
  struct pollfd *ufds;

  fd = popen ("xterm", "w");

  ufds = calloc (1, sizeof (struct pollfd));

  ufds->fd = fileno(fd);
  ufds->events = POLLHUP|POLLERR;

  switch (poll (ufds, 1, -1))
        {
        case -1:
          perror ("poll");
          break;
        case 0:
          fprintf (stderr, "timeout\n");
          break;
        default:
          printf ("it's work\n");
        }

  pclose (fd);

  return 0;
}
(victor@pts/1)~ $> gcc test.c                                             [sh]
(victor@pts/1)~ $> ./a.out                                                [sh]
it's work
(victor@pts/1)~ $>                                                        [sh]

ananas ★★★★★
()
Ответ на: комментарий от ananas

да. Если в мою программу подставить xterm, то все работает.

Но достаточно изменить вышепреведенную программу таким образом, как все перестает работать.

...
fd = popen ("gnuplot", "w");

fputs("plot sin(x)\n", fd);
fflush(fd);

ufds = calloc (1, sizeof (struct pollfd));
...

alexru ★★★★
() автор топика
Ответ на: комментарий от ananas

Такая конструкция не работает:

ufds->events = POLLOUT; while (poll (ufds, 1, -1)) {};

Или я не понял?

Как вариант мне подойдет такое решение: моя программа закрывается, а gnuplot остается висеть. Хотя как такое сотвроить я тоже не знаю.

alexru ★★★★
() автор топика
Ответ на: комментарий от ananas

Неа :)

Перебрал все возможные комбнации событий - ни одно правильно не отлавливается.

alexru ★★★★
() автор топика
Ответ на: комментарий от alexru

fd = popen("gnuplot -persist", "w");

понаписать в fifo...

pclose(fd);

тогда окошко не закроет. man gnuplot, короче

myhand
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.