Неблокирование канала с помощью popen?

Я использую это:

private void MainForm_Load(object sender, EventArgs e)
{
    if (Settings.Instance.HideAtStartup)
    {
        BeginInvoke(new MethodInvoker(delegate
        {
            Hide();
        }));
    }
}

, Очевидно, необходимо измениться если условие с Вашим.

17
задан Matt Joiner 7 May 2010 в 15:25
поделиться

4 ответа

Настройте следующим образом:

FILE *f = popen("./output", "r");
int d = fileno(f);
fcntl(d, F_SETFL, O_NONBLOCK);

Теперь вы можете прочитать:

ssize_t r = read(d, buf, count);
if (r == -1 && errno == EAGAIN)
    no data yet
else if (r > 0)
    received data
else
    pipe closed

Когда вы закончите, очистка:

pclose(f);
27
ответ дан 30 November 2019 в 12:00
поделиться

popen () внутренне вызывает pipe () , fork () , dup2 () (в точку fds 0/1/2 дочернего процесса в каналы) и execve () . Вы не думали об их использовании? В этом случае вы можете настроить канал, который вы читаете, на неблокирующий, используя fcntl () .

update : Вот пример, только для иллюстративных целей:

int read_pipe_for_command(const char **argv)
{
   int p[2];

   /* Create the pipe. */
   if (pipe(p))
   {
      return -1;
   }

   /* Set non-blocking on the readable end. */
   if (fcntl(p[0], F_SETFL, O_NONBLOCK))
   {
      close(p[0]);
      close(p[1]);
      return -1;
   }

   /* Create child process. */
   switch (fork())
   {
      case -1:
          close(p[0]);
          close(p[1]);
          return -1;
      case 0:
          /* We're the child process, close read end of pipe */
          close(p[0]);
          /* Make stdout into writable end */
          dup2(p[1], 1);
          /* Run program */
          execvp(*argv, argv);
          /* If we got this far there was an error... */
          perror(*argv);
          exit(-1);
      default:
          /* We're the parent process, close write end of pipe */
          close(p[1]);
          return p[0];
   }
}
6
ответ дан 30 November 2019 в 12:00
поделиться

Никогда не пробовал, но я не понимаю, почему вы не можете получить дескрипторы файлов с помощью fileno (), используйте fcntl ( ), чтобы установить его на неблокирование, и используйте read () / write (). Стоит попробовать.

2
ответ дан 30 November 2019 в 12:00
поделиться

Вы смотрели раздел «см. Также» на странице руководства для popen ()?

Быстрый поиск в Google показал эту страницу: http://beej.us/ guide / bgnet / output / html / singlepage / bgnet.html # blocking Говорит о блокировании и неблокировании доступа к файловым дескрипторам.

0
ответ дан 30 November 2019 в 12:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: