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

网站商城系统微信怎么搞小程序

网站商城系统,微信怎么搞小程序,做名人故居的网站多少钱,网站百度流量怎么做一、五种IO模型------读写外设数据的方式 阻塞: 不能操作就睡觉 非阻塞#xff1a;不能操作就返回错误 多路复用#xff1a;委托中介监控 信号驱动#xff1a;让内核如果能操作时发信号#xff0c;在信号处理函数中操作 异步IO#xff1a;向内核注册操作请求…一、五种IO模型------读写外设数据的方式 阻塞: 不能操作就睡觉 非阻塞不能操作就返回错误 多路复用委托中介监控 信号驱动让内核如果能操作时发信号在信号处理函数中操作 异步IO向内核注册操作请求内核完成操作后发通知信号 二、阻塞与非阻塞 应用层 ​ open时由O_NONBLOCK指示read、write时是否阻塞 ​ open以后可以由fcntl函数来改变是否阻塞 flags fcntl(fd,F_GETFL,0); flags | O_NONBLOCK; fcntl(fd, F_SETFL, flags);驱动层通过等待队列 wait_queue_head_t //等待队列头数据类型init_waitqueue_head(wait_queue_head_t *pwq) //初始化等待队列头wait_event_interruptible(wq,condition) /* 功能条件不成立则让任务进入浅度睡眠直到条件成立醒来wq:等待队列头conditionC语言表达式 返回正常唤醒返回0信号唤醒返回非0此时读写操作函数应返回-ERESTARTSYS */wait_event(wq,condition) //深度睡眠wake_up_interruptible(wait_queue_head_t *pwq)wake_up(wait_queue_head_t *pwq)/* 1. 读、写用不同的等待队列头rq、wq 2. 无数据可读、可写时调用wait_event_interruptible(rq、wq,条件) 3. 写入数据成功时唤醒rq读出数据成功唤醒wq */ 示例 mychar.h #ifndef MY_CHAR_H #define MY_CHAR_H#include asm/ioctl.h#define MY_CHAR_MAGIC c#define MYCHAR_IOCTL_GET_MAXLEN _IOR(MY_CHAR_MAGIC, 1, int *) #define MYCHAR_IOCTL_GET_CURLEN _IOR(MY_CHAR_MAGIC, 2, int *)#endif mychar.c #include linux/module.h #include linux/kernel.h #include linux/fs.h #include linux/cdev.h #include linux/wait.h #include linux/sched.h #include asm/uaccess.h #include asm/ioctl.h#include mychar.h#define BUF_LEN 100int major 11; //主设备号 int minor 0; //次设备号 int char_num 1; //设备号数量struct mychar_dev {struct cdev mydev;char mydev_buf[BUF_LEN];int curlen;wait_queue_head_t rq;wait_queue_head_t wq; }; struct mychar_dev gmydev;int mychar_open (struct inode *pnode, struct file *pfile)//打开设备 {pfile-private_data (void *) (container_of(pnode-i_cdev, struct mychar_dev, mydev));printk(open\n);return 0; }int mychar_close(struct inode *pnode, struct file *pfile)//关闭设备 {printk(close\n);return 0; }ssize_t mychar_read (struct file *pfile, char __user *puser, size_t count, loff_t *p_pos) {struct mychar_dev *pmydev (struct mychar_dev *)pfile-private_data;int size 0;int ret 0;/* 判断是否有数据可读 */if(pmydev-curlen 0) {if(pfile-f_flags O_NONBLOCK) { //非阻塞printk(O_NONBLOCK Not Data Read\n);return -1;} else { //阻塞/* 睡眠 当curlen0 时返回 */ret wait_event_interruptible(pmydev-rq, pmydev-curlen 0);if(ret) {return -ERESTARTSYS;}}}// 确定要读取的数据长度如果请求大于设备当前数据长度则读取全部可用数据if (count pmydev-curlen) {size pmydev-curlen;}else {size count;}// 将设备数据复制到用户空间缓冲区ret copy_to_user(puser, pmydev-mydev_buf, size);if(ret) {printk(copy_to_user failed\n);return -1;}// 移动设备内部缓冲区去除已读取的数据memcpy(pmydev-mydev_buf, pmydev-mydev_buf size, pmydev-curlen - size);pmydev-curlen - size;wake_up_interruptible(pmydev-wq);// 返回实际读取的字节数return size; }ssize_t mychar_write (struct file *pfile, const char __user *puser, size_t count, loff_t *p_pos) {struct mychar_dev *pmydev (struct mychar_dev *)pfile-private_data;int size 0;int ret 0;if(pmydev-curlen BUF_LEN) {if(pfile-f_flags O_NONBLOCK) { //非阻塞printk(O_NONBLOCK Can Not Write Data\n);return -1;} else { //阻塞ret wait_event_interruptible(pmydev-wq, pmydev-curlen BUF_LEN);if(ret) {return -ERESTARTSYS;}}}// 确定要写入的数据长度如果请求大于设备缓冲区剩余空间则写入剩余空间大小if (count BUF_LEN - pmydev-curlen) {size BUF_LEN - pmydev-curlen;}else {size count;}// 从用户空间复制数据到设备缓冲区ret copy_from_user(pmydev-mydev_buf pmydev-curlen, puser, size);if(ret) {printk(copy_from_user failed\n);return -1;}// 更新设备缓冲区中的数据长度pmydev-curlen size;/* 唤醒读阻塞 */wake_up_interruptible(pmydev-rq);// 返回实际写入的字节数return size; }long mychar_ioctl(struct file *pfile, unsigned int cmd, unsigned long arg) {struct mychar_dev *pmydev (struct mychar_dev *)pfile-private_data;int __user *pret (int *)arg;int maxlen BUF_LEN;int ret 0;switch(cmd) {case MYCHAR_IOCTL_GET_MAXLEN:ret copy_to_user(pret, maxlen, sizeof(int));if(ret) {printk(copy_from_user failed\n);return -1;}break;case MYCHAR_IOCTL_GET_CURLEN:ret copy_to_user(pret, pmydev-curlen, sizeof(int));if(ret) {printk(copy_from_user failed\n);return -1;}break;default:printk(The is a know\n);return -1;}return 0; }struct file_operations myops {.owner THIS_MODULE,.open mychar_open,.read mychar_read,.write mychar_write,.unlocked_ioctl mychar_ioctl, };int __init mychar_init(void) {int ret 0;dev_t devno MKDEV(major, minor);/* 手动申请设备号 */ret register_chrdev_region(devno, char_num, mychar);if (ret) {/* 动态申请设备号 */ret alloc_chrdev_region(devno, minor, char_num, mychar);if(ret){printk(get devno failed\n);return -1;}/*申请成功 更新设备号*/major MAJOR(devno);}/* 给struct cdev对象指定操作函数集 */cdev_init(gmydev.mydev, myops);/* 将struct cdev对象添加到内核对应的数据结构中 */gmydev.mydev.owner THIS_MODULE;cdev_add(gmydev.mydev, devno, char_num);/* 初始化 */init_waitqueue_head(gmydev.rq);init_waitqueue_head(gmydev.wq);return 0; }void __exit mychar_exit(void) {dev_t devno MKDEV(major, minor);printk(exit %d\n, devno);/* 从内核中移除一个字符设备 */cdev_del(gmydev.mydev);/* 回收设备号 */unregister_chrdev_region(devno, char_num);}MODULE_LICENSE(GPL); module_init(mychar_init); module_exit(mychar_exit); testmychar_blockwait.c #include stdio.h #include sys/types.h #include sys/stat.h #include fcntl.h #include string.h #include sys/ioctl.h#include mychar.h int main(int argc, char *argv[]) {int fd -1;char buf[100];if(argc 2) {printf(The argument is too few\n);return -1;}fd open(argv[1], O_RDWR);if(fd 0) {perror(open);return -1;}memset(buf, C, sizeof(buf));if ( (write(fd, buf, strlen(buf)) ) 0 ) {printf(write failed\n);return -1;}close(fd);fd -1;return 0; } testmychar_blockread.c #include stdio.h #include sys/types.h #include sys/stat.h #include fcntl.h #include string.h #include sys/ioctl.h#include mychar.h int main(int argc, char *argv[]) {int fd -1;char buf[32] ;int ret 0;if(argc 2) {printf(The argument is too few\n);return -1;}fd open(argv[1], O_RDWR);if(fd 0) {perror(open);return -1;}if ( (read(fd, buf, sizeof(buf)) ) 0 ) {printf(read failed\n);return -1;} else {printf(buf %s\n, buf);}close(fd);fd -1;return 0; } 运行结果
http://www.zqtcl.cn/news/844867/

相关文章:

  • wordpress菜谱网站网站服务公司
  • 跳转网站代码互联网平台构建怎么写
  • 服务器网站建设维护uemo网站源码
  • 浏览器如何做购物网站百度快照提交入口
  • 网站建设的主要步骤有哪些金华网站建设平台
  • 扁平化网站布局稷山网站制作
  • 做画找图网站包装策划与设计专业
  • 适合大学生做的兼职网站深圳企业名录大全
  • 电脑做网站用什么软件培训心得体会2000字
  • 手机网站开发公司哪家最专业html5商业网站开发北大青鸟
  • 做爰全过程教育网站建筑工程公司名字起名大全
  • 如何作做网站网站建设需要掌握什么技术
  • 广州网站建设推广公司做网站怎么合并单元格
  • 网站建设策划书的编制怎样建网站域名
  • 公司做网站的费用怎么记账网站源码html
  • 网站流量数据东莞松山湖华为招聘信息
  • 跨境电商一站式服务平台wordpress用旧的编辑器
  • 上海外贸网站推广方法爱站关键词
  • 网站页面框架设计企业建设流程
  • 网站做留言板如何推广小程序商城
  • 金融社区类网站建设鞍山58同城招聘网
  • 网站搭建策划书wordpress 屏蔽插件更新
  • 做网上购物网站杭州房产网官方网站
  • 汕头市网站建设分站公司站长网站大全
  • c2c的网站名称和网址深圳设计公司办公室
  • 建设银行企业版网站做微网站平台
  • 北京企业网站建设电话长沙建设工程信息网
  • 大型综合门户网站开发扁平化个人网站
  • 怎么做代理人金沙网站长沙 网站运营
  • 商城网站开发的目的和意义鲜花类网站建设策划书范文