八、GIO Channels
1 基本概念
IO Channels由GIOChannel结构描述,被GLib封装,必须通过公共函数来访问它的各个成员。每个IO Channel和一个文件或者类似于文件的对象相联系,在Linux上,IO Channel可以和打开文件描述符,套接字,管道如此以后就可以像访问文件一样操作IO Channels。
每个IO Channel上可以关联一些事件及其相应函数(watch),这个挂接在主循环上,于是乎,当事件来临之后,消息相应便可动作。
1.1 套接字(Socket)
对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接子上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口。
1.2 文件描述符(file descriptor)
内核利用文件描述符来访问文件。文件描述符是非负整数。打开现存文件或新建文件时候,内核会返回一个文件描述符。读写文件也需要使用文件描述符来制订待读写的文件。
1.3 计算机管道
1.3.1 基本概念
管道(pipe)是进程用来通讯的共享内存区域。一个进程往管道中写入信息,而其它的进程可以从管道中读出信息。如其名,管道是进程间数据交流的通路。
1.3.2 fork( )函数:创建新的进程
#include<unistd.h>
__pid_t fork (void);
- Return:一个是子进程返回0,第二个是父进程大于0,错误返回-1
1.3.3 pipe( )函数:建立管道
#include<unistd.h>
int pipe(int filedes[2]);
- pipe()会建立管道,并将文件描述词由参数filedes数组返回。
- filedes[0]为管道里的读取端。
- filedes[1]则为管道里的写入端。
2 GIO Channel相关函数总结
2.1 创建新的GIOChannel
适用于普通文件描述符、管道、套接字。
GIOChannel* g_io_channel_unix_new (int fd);
与系统无关的方式为文件创建通道。
GIOChannel* g_io_channel_new_file (const gchar *filename,const gchar *mode,GError **error);
通过GIOChannel得到文件描述符。
gint g_io_channel_unix_get_fd (GIOChannel *channel);
2.2 读取数据
2.2.1读取一行数据
除了一个gchar、GString存储字符串以为,还没有发现真正的区别。注意的是,每读取一行,指针指向的行跟着变化。
GIOStatus g_io_channel_read_line (GIOChannel *channel,gchar **str_return,gsize *length,gsize *terminator_pos,GError **error);
typedef enum
{G_IO_STATUS_ERROR,G_IO_STATUS_NORMAL,G_IO_STATUS_EOF,G_IO_STATUS_AGAIN
} GIOStatus;
GIOStatus g_io_channel_read_line_string (GIOChannel *channel,GString *buffer,gsize *terminator_pos,GError **error);
2.2.2 读取文件中剩余数据
GIOStatus g_io_channel_read_to_end (GIOChannel *channel,gchar **str_return,gsize *length,GError **error);
2.3 添加到事件循环
给定优先级
guint g_io_add_watch_full (GIOChannel *channel,gint priority,GIOCondition condition,GIOFunc func,gpointer user_data,GDestroyNotify notify);
guint g_io_add_watch (GIOChannel *channel,GIOCondition condition,GIOFunc func,gpointer user_data);
typedef enum /*< flags >*/
{G_IO_IN GLIB_SYSDEF_POLLIN,/*有待读取资料*/G_IO_OUT GLIB_SYSDEF_POLLOUT,/*可写入资料*/G_IO_PRI GLIB_SYSDEF_POLLPRI,/*有待读取的紧急资料*/G_IO_ERR GLIB_SYSDEF_POLLERR,/*发生错误*/G_IO_HUP GLIB_SYSDEF_POLLHUP,/*连接挂断*/G_IO_NVAL GLIB_SYSDEF_POLLNVAL/*无效请求*/
} GIOCondition;
2.4 关闭IO通道
如果flush为TRUE,则将刷新任何要写入的待处理数据。使用g_io_channel_unref()删除最后一个引用之前,不会释放该通道。
GIOStatus g_io_channel_shutdown (GIOChannel *channel,gboolean flush,GError **err);
参考1:本文代码参考博客
参考2:IO Channels
参考3:GIOChannel与Pipe
参考4:fork()+pipe() --> 父子进程间通过管道通信
八、GIO Channels相关推荐
- go channel 缓冲区最大限制_GO语言圣经学习笔记(八)Goroutines和Channels
奋斗鸭!Day97 知识点 goroutinue 基本用法 golang非常深度的简化了goroutinue的使用方法,异常简单,门槛降低很多 // goroutinue 使用非常简单go f() G ...
- OpenCV学习笔记(六)(七)(八)(九)(十)
OpenCV学习笔记(六)--对XML和YAML文件实现I/O操作 1. XML.YAML文件的打开和关闭 XML\YAML文件在OpenCV中的数据结构为FileStorage,打开操作例如: [c ...
- 【opencv学习笔记八】创建TrackBar轨迹条
createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便.首先大家要记住,它往往会和一个回调函数配合起来使用.先看下他的函数 ...
- PyTorch框架学习十八——Layer Normalization、Instance Normalization、Group Normalization
PyTorch框架学习十八--Layer Normalization.Instance Normalization.Group Normalization 一.为什么要标准化? 二.BN.LN.IN. ...
- WCF技术剖析之二十八:自己动手获取元数据[附源代码下载]
WCF技术剖析之二十八:自己动手获取元数据[附源代码下载] 原文:WCF技术剖析之二十八:自己动手获取元数据[附源代码下载] 元数据的发布方式决定了元数据的获取行为,WCF服务元数据架构体系通过Ser ...
- (十八)视频换-脸、无训练高速换-脸、一张图片即可完成、批量处理
(十八)最新批量视频换脸.无训练高速换脸.一张图片即可完成.批量处理 本文结合最新的AI模型实现人脸融合,效果得到很好提升.本模型使用多尺度编码器提取原图属性特征,使用预训练人脸识别模型数据提取用户图 ...
- Linux 驱动开发 四十八:Linux INPUT 子系统实验
一.input 子系统简介 input 就是输入的意思,因此 input 子系统就是管理输入的子系统,是 Linux 内核针对某一类设备而创建的框架. 比如按键输入.键盘.鼠标.触摸屏等等这些都属于输 ...
- saiku+kettle整合(八)saiku展示改善
title: saiku+kettle整合(八)saiku展示改善 tags: OLAP categories: saiku date: 2016-08-25 18:18:54 saiku展示改善 开 ...
- Python游戏开发,pygame模块,Python实现八音符小游戏
开发工具** Python版本:3.6.4 相关模块: cocos2d模块: pyaudio模块: 以及一些Python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模 ...
最新文章
- css中overflow:hidden的属性 可能会导致js下拉菜单无法显示
- 网络营销——网络营销专员到底是教你如何选择网站页面制作
- Xilinx Platform Cable USB II 下载器驱动安装教程——Win10
- kafka logstash elk
- silverlight游戏在坑内发展
- Java 并没有死!
- 下拉树取值与赋值单元格填报(取值赋值)
- ubuntu 安装GPU黑屏 修改GRUB_安装Ubuntu 18.04系统的相关注意事项,及解决Ubuntu 双系统黑屏问题...
- 使用$.getJSON解决ajax跨域访问 JQuery 的跨域方法(服务器端为wordpress程序)
- vasp 计算杨氏弹性_高阶弹性常数计算的一点建议
- 有关第四章css的介绍
- CVX约束中需要使用一些中间变量该怎么办
- Android事件总线 EventBus3.0用法学习
- 软件工程师的试炼之地:53道Python面试问答
- 原件常识:以“光”为传媒的光电耦合器
- 残差(residual)
- java输出GPA,简单的C GPA计算器问题
- Visio2013 取消箭头的自动连接
- 蓝桥杯刷题冲刺 | 倒计时20天
- 亲,你的浏览器过时了,请立即更换Chrome浏览器。
热门文章
- AutowareAuto泊车案例复现及原理简介
- Java毕设项目教育培训机构信息管理系统计算机(附源码+系统+数据库+LW)
- 基于caffe的鉴黄图片分类c++代码
- 2012-9-20nbsp;《考研词汇速记024》
- windows server 2012/2016 设置多用户远程桌面
- Diopter mac版(AE光线折射朦胧模糊插件)
- svn开分支合分支实例说明
- SpringBoot中@SpringBootApplication注解的三体结构解析
- 魅族持续交付平台建设实践
- 线性时间选择求第k小数(分治)