私はstdin
とソケットから同時にデータを待つCプログラムを書こうと思っていました。これを達成するために、poll()
を使用したかったのです。stdinとソケットから同時にポーリングするには?
しかし、stdin
上poll
作品は...私はそれはそれはソケットに振る舞うだけのように振る舞うことが期待どのように私は誤解と思われる、それはされています。私は実際には、端末で何かを入力した(と場合にのみ、好ましくも押された場合POLLIN
を報告RETURN
)。
#include <poll.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
int main()
{
int ret_poll; ssize_t ret_read;
struct pollfd input[1] = {{fd: 0, events: POLLIN}};
char buff[100];
while(1) {
ret_poll = poll(input, 1, 0);
printf("ret_poll:\t%d\nerrno:\t%d\nstrerror:\t%s\n",
ret_poll, errno, strerror(errno));
ret_read = read(0, buff, 99);
printf("ret_read:\t%zd\nerrno:\t%d\nstrerror:\t%s\nbuff:\t%s\n",
ret_read, errno, strerror(errno), buff);
}
}
しかし、私はpoll
を言ったとき(上記の例では上POLLIN
を待つことがわかった。この仮定が正しいかどう
stdin
上
poll
sがという簡単なプログラムを書きました
stdin
)
poll
は、実際に何かを入力したかどうかにかかわらず、ただちにすべてを返します。その後、もちろん、
read()
が
stdin
ブロックに続いています。だから私は、これは私が同時に端末に入力から待つことができないとソケット:(
から、実際に読むためにデータがある場合にのみstdin
にpoll
レポートにPOLLIN
を作ることが可能であることを意味すると思う?
タイムアウトが0に設定されているため、すぐにポーリングが返されませんか?戻り値は0か-1か? – Roecrew
'{{fd:0、events:POLLIN}}'は無効なCの構文です。 – Olaf
@Olaf: '{{.fd = 0、.events = POLLIN}}' - 今はどうですか? – gaazkam