Я использую это:
private void MainForm_Load(object sender, EventArgs e)
{
if (Settings.Instance.HideAtStartup)
{
BeginInvoke(new MethodInvoker(delegate
{
Hide();
}));
}
}
, Очевидно, необходимо измениться если условие с Вашим.
Настройте следующим образом:
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);
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];
}
}
Никогда не пробовал, но я не понимаю, почему вы не можете получить дескрипторы файлов с помощью fileno (), используйте fcntl ( ), чтобы установить его на неблокирование, и используйте read () / write (). Стоит попробовать.
Вы смотрели раздел «см. Также» на странице руководства для popen ()?
Быстрый поиск в Google показал эту страницу: http://beej.us/ guide / bgnet / output / html / singlepage / bgnet.html # blocking Говорит о блокировании и неблокировании доступа к файловым дескрипторам.