当前位置: 首页 > news >正文

上的网站app如何做网站教程简单

上的网站app,如何做网站教程简单,西安东郊网站建设,网站空间的选择Socket 是网络协议栈暴露给编程人员的 API#xff0c;相比复杂的计算机网络协议#xff0c;API 对关键操作和配置数据进行了抽象#xff0c;简化了程序编程。 本文讲述的 socket 内容源自 Linux 发行版 centos 9 上的 man 工具#xff0c;和其他平台#xff08;比如 os-x …  Socket 是网络协议栈暴露给编程人员的 API相比复杂的计算机网络协议API 对关键操作和配置数据进行了抽象简化了程序编程。 本文讲述的 socket 内容源自 Linux 发行版 centos 9 上的 man 工具和其他平台比如 os-x 及不同版本会有些出入。本文主要对各 API 进行详细介绍从而更好的理解 socket 编程。 poll poll()           遵循 POSIX.1 - 2008 ppoll()         遵循 Linux 1.库 标准 c 库libc, -lc 2.头文件 poll.h 3.接口定义 int poll(struct pollfd *fds, nfds_t nfds, int timeout);int ppoll(struct pollfd *fds, nfds_t nfds,const struct timespec *_Nullable tmo_p,const sigset_t *_Nullable sigmask); 4.接口描述 poll() 和 select() 做的事情差不多它等待一个文件描述符集 I/O 就绪。Linux 的 epoll() 也是类似的只是比 poll() 提供多了一些特性。 fds 参数是要监控的文件描述符集是下面结构体的一个数组 struct pollfd {int fd; /* file descriptor */short events; /* requested events */short revents; /* returned events */}; 由调用者指定 fds 的项数。 结构体中 fd 包含了一个打开的文件描述符如果它是负值那么 events 参数将被忽略revents 返回 0。也就是说 可以讲 fd 设置为其补码就可以忽略它。 events 参数是一个输入参数通过按位掩码来标识应用感兴趣的文件描述符上的事件。参数可以设置为 0那么就只能返回 POLLHUP/POLLERR/POLLNVAL 事件。 revents 是一个输出参数由内核填充实际发生的事件。这些事件可以是 events 中指定的事件也可以是  POLLHUP/POLLERR/POLLNVAL 中的一个。events 中这三个事件对应的位并没有什么意义只要对应的条件发生revents 就会返回该事件。 如果没有请求的事件包括错误发生那么 poll() 会一直阻塞直到有事件发生。 timeout 参数指定了 poll() 等待文件描述符就绪的毫秒数该调用会一直阻塞直到 文件描述符就绪调用被信号打断发生超时 同样timeout 值也会向上近似到系统时钟粒度由于内核调度延迟阻塞的事件可能会稍微多一点。如果 timeout 是负值表示超时时间是无限长。如果 timeout 设置为 0那么 poll() 会马上返回即使没有任何文件描述符就绪。 events 和 revents 中各个位在 poll.h 中定义 POLLIN 有数据可以读。 POLLPRI 文件描述符上有异常发生可能是1TCP socket 上有带外数据2处于报文模式的伪终端主机发现了从机状态变化3cgroup.events 文件被修改了。 POLLOUT 当前可写但是写大于 socket 或 pipe 中可用空间的数据仍然会导致阻塞除非设置了 O_NONBLOCK。 POLLRDHUP 流 socket 对端关闭了连接或者在写半连接时关机。这个定义依赖于 _GNU_SOURCE 宏定。 POLLERR 发生错误。如果文件描述符指向了 pipe 的写端而读端关闭了那么也会返回这个错误。 POLLHUP 挂断。在读取 pipe 或者流 socket 时这个事件只表示对端关闭了其通道后面的数据读取时在通道中数据读尽后再继续读会返回 0EOF。 POLLNVAL 请求不合法fd 没有打开。 在使用 _XOPEN_SOURCE 宏编译时还会有以下一些事件不过也没有提供太多信息 POLLRDNORM 等同于 POLLIN。 POLLRDBAND 优先带宽数据可以读通常在 Linux 上用 POLLWRNORM 等同于 POLLOUT POLLWRBAND 可能写了优先数据 ppoll() ppoll() 和 poll() 的关系就像 select() 和 pselect() 的关系一样ppoll() 为应用提供了等待信号或者就绪事件的安全方法。 除了 timeout 时间精度上的差异以下两段代码几乎等效 ready ppoll(fds, nfds, tmo_p, sigmask);sigset_t origmask;int timeout;timeout (tmo_p NULL) ? -1 :(tmo_p-tv_sec * 1000 tmo_p-tv_nsec / 1000000);pthread_sigmask(SIG_SETMASK, sigmask, origmask);ready poll(fds, nfds, timeout);pthread_sigmask(SIG_SETMASK, origmask, NULL); 上面代码说成几乎等效而不是等效主要是因为负值的 timeout 会被 poll() 解释为一直等待而 ppoll() 中负值的 *tmo_p 会报错。 可以参考 pselect(2) 来看为什么 ppoll 是必要的。 如果 sigmask 参数为 NULL那么就不会有任何信号屏蔽操作这时这两个接口唯一的区别就是时间精度。 tmo_p 指定了 ppoll() 会阻塞的时间上限它是指向 timespec 结构体的指针指针为空时ppoll() 会一直阻塞。 5.返回值 成功时poll() 返回一个非负数表示 pollfds 中有多少个文件描述符上有事件发生即对应的 revents 有被更新为非 0 值。返回 0 表示没有任何文件描述符就绪并超时。 发生错误时返回 -1并设置errno 来指示错误类型。 错误值定义如下 EFAULTfds 指向了进程外的地址空间EINTR请求事件发生前发生了信号具体参见 signal(7)EIVALnfds 值超出了 RLIMIT_NOFILE 限制EINVALppoll() 中的 *tmo_P 是一个非法值负数ENOMEM没有足够内存来分配内核数据结构 一些其他 UNIX 系统上如果内核无法发分配内核资源poll() 可能会产生 EAGAIN 类的错误而不像 Linux 上的 ENOMEM。POSIX 允许这种行为。所以一个可移植的程序需要检测该错误并重试就像处理 EINTR 一样。 一些实现定义了非标准常量 INFTIM-1用作 poll() 的 timeout但是这个常量并没有被被 glibc 提供。 6.注意 poll() 和 ppoll() 的行为不受 O_NONBLOCK 标志影响。 对于一个文件描述符正在被 poll() 监听却被另一个线程关闭了这种情况的讨论可以参考 select(2)。 7.BUGS 可以参考 select(2) 中关于虚假就绪通知的讨论。  8.代码实例 该程序会打开命令行参数传进来的文件名并监听其 POLLIN 事件程序会循环调用 poll() 来监听文件描述符打印已经就绪的文件描述符数。对于每个就绪的文件描述符程序会 以可读的格式显示返回的 revents如果文件描述符就绪那么就从中读一些数据出来并打印如果文件描述符不可读但是发生了一些其他事件比如 POLLHUP就关闭文件描述符 假定我们在一个终端运行程序让他打开一个 FIFO $ mkfifo myfifo$ ./poll_input myfifo 在另一个终端打开 FIFO并写入一些数据然后关闭 FIFO $ echo aaaaabbbbbccccc myfifo我们将在运行程序的终端上看到如下信息 Opened myfifo on fd 3About to poll()Ready: 1fd3; events: POLLIN POLLHUPread 10 bytes: aaaaabbbbbAbout to poll()Ready: 1fd3; events: POLLIN POLLHUPread 6 bytes: cccccAbout to poll()Ready: 1fd3; events: POLLHUPclosing fd 3All file descriptors closed; bye 从上面我们可以看到 poll() 返回了三次 第一次返回是 POLLIN表示文件描述符可读另一个是 POLLHUP 表示文件描述符的另一个端关闭了。程序接着读取了一些可用的输入数据第二次返回同样是这两个事件依然消费了一些可用数据最后一次返回poll() 只有 POLLHUP 事件然后关闭文件描述符并结束了程序。 /* poll_input.cLicensed under GNU General Public License v2 or later.*/#include fcntl.h#include poll.h#include stdio.h#include stdlib.h#include unistd.h#define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \} while (0)intmain(int argc, char *argv[]){int ready;char buf[10];nfds_t num_open_fds, nfds;ssize_t s;struct pollfd *pfds;if (argc 2) {fprintf(stderr, Usage: %s file...\n, argv[0]);exit(EXIT_FAILURE);}num_open_fds nfds argc - 1;pfds calloc(nfds, sizeof(struct pollfd));if (pfds NULL)errExit(malloc);/* Open each file on command line, and add it to pfds array. */for (nfds_t j 0; j nfds; j) {pfds[j].fd open(argv[j 1], O_RDONLY);if (pfds[j].fd -1)errExit(open);printf(Opened \%s\ on fd %d\n, argv[j 1], pfds[j].fd);pfds[j].events POLLIN;}/* Keep calling poll() as long as at least one file descriptor isopen. */while (num_open_fds 0) {printf(About to poll()\n);ready poll(pfds, nfds, -1);if (ready -1)errExit(poll);printf(Ready: %d\n, ready);/* Deal with array returned by poll(). */for (nfds_t j 0; j nfds; j) {if (pfds[j].revents ! 0) {printf( fd%d; events: %s%s%s\n, pfds[j].fd,(pfds[j].revents POLLIN) ? POLLIN : ,(pfds[j].revents POLLHUP) ? POLLHUP : ,(pfds[j].revents POLLERR) ? POLLERR : );if (pfds[j].revents POLLIN) {s read(pfds[j].fd, buf, sizeof(buf));if (s -1)errExit(read);printf( read %zd bytes: %.*s\n,s, (int) s, buf);} else { /* POLLERR | POLLHUP */printf( closing fd %d\n, pfds[j].fd);if (close(pfds[j].fd) -1)errExit(close);num_open_fds--;}}}}printf(All file descriptors closed; bye\n);exit(EXIT_SUCCESS);}
http://www.hkea.cn/news/14258120/

相关文章:

  • 设计素材网站有哪些免费自己买服务器能在wordpress建网站
  • 泰州网站建设报价电影cms系统
  • 网站设计实施方案wordpress文章页面优化
  • 手机app手机网站开发无为网站建设
  • 怎么自己做个免费网站wordpress 博主
  • 如何在国外网站开发新客人在线 建站单页面网站带后台
  • 装修网站怎么做的好处怎样用eclipse做网站
  • 滁州市建设工程管理处网站网站开发设计选题背景
  • 石家庄网站建设wsjz手机网站大全观看
  • 市政浙江建设培训中心网站网站挣钱方式
  • 网站开发阶段流程图阿里云wordpress优化
  • 网站开发团队工作总结网站制作公司站建设
  • 别人做的网站如何要回服务器wordpress 快速编辑
  • 做网站需要的图片大小wordpress图片管理插件
  • 专做洗衣柜的网站做网站的外包公司
  • 网站后台 英语一个域名怎么做多个网站
  • 技术支持 嘉兴网站建设线上营销技巧和营销方法
  • 芭乐站长统计 网站统计网站开发设计合同范本
  • 广州网站建设开发团队wordpress修改logo
  • 网站后端开发语言图书页面设计模板
  • 设计网页的快捷网站网站怎么做收录
  • 有免费搭建app的网站吗3天引流800个人技巧
  • 免费的高清视频素材网站搜索网站logo怎么做
  • 蓬莱有做网站的吗菏泽做网站推广
  • 网站如何做淘宝客wordpress js加速
  • 宜春招聘网站开发区招工oa系统的功能和作用
  • 做视频招标的网站有哪些青岛科技街网站建设
  • 网站换模板电力网站建设
  • 婚恋网站应聘做销售上杭网站开发
  • 做汽车的网站编辑如何建设免费网站视频