select唤醒函数
2015-07-01 19:20
686 查看
在多进程、多任务程序中,函数执行过程中会遇到阻塞无法继续执行等问题,需要对函数进行唤醒。可以创建子进程继续执行子函数,也可以在单进程中使用select函数进行阻塞唤醒。
通过man命令查看select函数原型是
int select(int n,fd_set *read_fds,fd_set *write_fds,fd_set *except_fds,struct timeval *timeout)
下面是具体使用方法
select函数暂时介绍到这里。
通过man命令查看select函数原型是
int select(int n,fd_set *read_fds,fd_set *write_fds,fd_set *except_fds,struct timeval *timeout)
下面是具体使用方法
#include<stdio.h> #include<sys/socket.h> #include<sys/types.h> #include<netinet/in.h> #include<arpa/inet.h> #include<string.h> #include<stdlib.h> int main(int argc, const char *argv[]) { int sockfd; char buf[64]; if((sockfd = socket(PF_INET,SOCK_DGRAM,0)) == -1) { perror("socket"); exit(1); } struct sockaddr_in myaddr,cli_addr; memset(&myaddr,0,sizeof(myaddr)); myaddr.sin_family = PF_INET; myaddr.sin_port = htons(50001); myaddr.sin_addr.s_addr = inet_addr("192.168.4.69"); if(bind(sockfd,(struct sockaddr *)&myaddr,sizeof(myaddr)) == -1) { perror("bind"); exit(1); } int len = sizeof(cli_addr); fd_set readfds; FD_ZERO(&readfds); while(1) { FD_SET(0,&readfds); FD_SET(sockfd,&readfds); select(4,&readfds,NULL,NULL,NULL); if(FD_ISSET(0,&readfds))//如果FD_ISSET返回值为非0,说明文件描述符就绪 { memset(buf,0,sizeof(buf)); fgets(buf,sizeof(buf),stdin); printf("stdin:%s\n",buf); } if(FD_ISSET(sockfd,&readfds)) { memset(buf,0,sizeof(buf)); recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&cli_addr,&len); printf("client:%s\n",buf); } } return 0; }
select函数暂时介绍到这里。
相关文章推荐
- Oracle阻塞(blockingblocked)实例详解
- 科学知识:同步、异步、阻塞和非阻塞区别
- SQL2008中SQL应用之-阻塞(Blocking)应用分析
- Oracle 阻塞(blocking blocked)介绍和实例演示
- 利用sys.sysprocesses检查SqlServer的阻塞和死锁
- js异步加载的三种解决方案
- SQL Server误区30日谈 第2天 DBCC CHECKDB会导致阻塞
- Oracle RAC环境下的阻塞(blocking blocked)介绍和实例演示
- Java基于Runtime调用外部程序出现阻塞的解决方法
- nodejs中实现阻塞实例
- PHP session文件独占锁引起阻塞问题解决方法
- java执行bat命令碰到的阻塞问题的解决方法
- 【集群】WebLogic线程阻塞的问题(图)
- 聊聊并发-Java中的阻塞队列
- 阻塞赋值和非阻塞赋值
- oracle enq: TX - row lock contention 解决方案(oracle SQL 语句在行锁上被阻塞 解决办法)
- 转:同步/异步 与 阻塞/非阻塞 的关系
- 同步与异步 阻塞与非阻塞
- 非阻塞式的socket send recv
- 脚本的加载与性能