poll调用和select调用实现的功能一样,都是网络IO利用的一种机制。
需要的的库
#include <poll.h>
int poll(struct pollfd fds[], nfds_t nfds, int timeout);
struct pollfd {
int fd;
short events;
short revents;
};
fd表示文件描述符;
events表示请求检测的事件;
revents表示检测之后返回的事件;
events的取值
常量 说明
POLLIN 普通或优先级带数据可读
POLLRDNORM 普通数据可读
POLLRDBAND
优先级带数据可读
POLLPRI
高优先级数据可读
POLLOUT
普通数据可写
POLLWRNORM
普通数据可写
POLLWRBAND
优先级带数据可写
POLLERR
发生错误
POLLHUP
发生挂起
POLLNVAL
描述字不是一个打开的文件
nfds:用于标记数组fds中的struct pollfd结构元素的总数量;
timeout:poll函数调用阻塞的时间,单位是MS(毫秒)
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <string.h>
#include <poll.h>
int main()
{
int pipefd[2];
int i;
if (pipe(pipefd) < 0)//创建管道
{
printf("create pipe failed\n");
return -1;
}
pid_t pid = fork();//创建进程
if (pid == 0)//进入子进程
{
printf("child fork is running\n");
close(pipefd[0]);//关闭管道读取
char str[50];
for (i =0; i < 5; i++)
{
sleep(3);
sprintf(str, "child fork msg %d ", i);
write (pipefd[1], str, strlen(str));//循环5次向管道输入数据
}
}else
{//父进程
printf("parent fork is running\n");
char str[50];
close(pipefd[1]);//关闭管道输;
struct pollfd fds[2];
fds[0].fd = pipefd[0];
fds[0].events = POLLIN;
fds[1].fd = 0;
fds[1].events = POLLIN;
while (fds[0].events || fds[1].events)
{
if (poll(fds, 2, 3000) <= 0)//监听50秒等待管道输入和标准输入流,50秒后结束
{
printf("poll failed\n");
return 1;
}
if (fds[0].revents)
{
str[read(pipefd[0], str, 50)] = '\0';
printf("parent recv is %s\n", str);
}
if (fds[1].revents)
{
str[read(0, str, 256)] = '\0';
printf("stdout is %s\n", str);
}
}
int status;
wait(&status);
}
return 0;
}
parent recv is child fork msg 0
parent recv is child fork msg 1
parent recv is child fork msg 2
parent recv is child fork msg 3
输入le
stdout is le
parent recv is child fork msg 4
输入yyy
stdout is yyy