15
A
回答
25
設置是這樣的:
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);
0
你看着這個男人頁面爲POPEN的「又見」部分()?
快速谷歌搜索顯示此頁:http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html#blocking談論阻塞和非阻塞訪問文件描述符。
2
4
popen()
內部調用pipe()
,fork()
,dup2()
(指向子進程的FDS 0/1/2的管道)和execve()
。你有沒有考慮過使用這些?在這種情況下,您可以使用fcntl()
將您讀取的管道設置爲非阻塞。
更新:下面是一個例子,只是爲了說明目的:
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 parent process, close the writable part of the pipe */
close(p[1]);
return p[0];
default:
/* Close readable 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);
}
}
相關問題
- 1. 非阻塞命名管道
- 2. 非阻塞管道中的I/O
- 3. 管道上的非阻塞讀取
- 4. 記錄到非阻塞命名管道?
- 5. 在PHP中非阻塞打開管道
- 6. C#或Python管道阻塞
- 7. 從管道讀取阻塞
- 8. mpi:阻塞與非阻塞
- 9. 使Javascript非阻塞
- 10. 使用非阻塞腳本
- 11. python非阻塞recv與進程之間的管道?
- 12. 如何從Solaris的命令行製作非阻塞管道?
- 13. shell/filesystem中的非阻塞/異步FIFO /命名管道?
- 14. Preproious Popen管道
- 15. 從Python的ftplib管道不阻塞
- 16. 管道上的read()沒有被阻塞
- 17. 帶延遲的阻塞/非阻塞
- 18. 使用select與阻塞和非阻塞套接字的影響
- 19. 使用非阻塞的SocketChannel,是否阻塞了Socket?
- 20. 非阻塞django?
- 21. 非阻塞setTimeout
- 22. 非阻塞spmd
- 23. 非阻塞pthread_join
- 24. PyGTK非阻塞
- 25. Javascript非阻塞
- 26. 非阻塞stdio
- 27. 如何在Perl中對管道進行非阻塞式讀取?
- 28. 如何在命名管道(mkfifo)上執行非阻塞fopen?
- 29. 關閉非阻塞套接字通道
- 30. 非阻塞的PipedStreams?
美麗地工作...謝謝! – jldupont 2009-11-16 18:30:10
作爲FILE指針的管道是固有緩衝的,是否有任何保證,通過直接使用文件描述符,你不會錯過被拉入文件緩衝區的東西,或者只要你不先打電話給fget/fread/etc? – stu 2016-06-03 17:10:16