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相关推荐

  1. go channel 缓冲区最大限制_GO语言圣经学习笔记(八)Goroutines和Channels

    奋斗鸭!Day97 知识点 goroutinue 基本用法 golang非常深度的简化了goroutinue的使用方法,异常简单,门槛降低很多 // goroutinue 使用非常简单go f() G ...

  2. OpenCV学习笔记(六)(七)(八)(九)(十)

    OpenCV学习笔记(六)--对XML和YAML文件实现I/O操作 1. XML.YAML文件的打开和关闭 XML\YAML文件在OpenCV中的数据结构为FileStorage,打开操作例如: [c ...

  3. 【opencv学习笔记八】创建TrackBar轨迹条

    createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便.首先大家要记住,它往往会和一个回调函数配合起来使用.先看下他的函数 ...

  4. PyTorch框架学习十八——Layer Normalization、Instance Normalization、Group Normalization

    PyTorch框架学习十八--Layer Normalization.Instance Normalization.Group Normalization 一.为什么要标准化? 二.BN.LN.IN. ...

  5. WCF技术剖析之二十八:自己动手获取元数据[附源代码下载]

    WCF技术剖析之二十八:自己动手获取元数据[附源代码下载] 原文:WCF技术剖析之二十八:自己动手获取元数据[附源代码下载] 元数据的发布方式决定了元数据的获取行为,WCF服务元数据架构体系通过Ser ...

  6. (十八)视频换-脸、无训练高速换-脸、一张图片即可完成、批量处理

    (十八)最新批量视频换脸.无训练高速换脸.一张图片即可完成.批量处理 本文结合最新的AI模型实现人脸融合,效果得到很好提升.本模型使用多尺度编码器提取原图属性特征,使用预训练人脸识别模型数据提取用户图 ...

  7. Linux 驱动开发 四十八:Linux INPUT 子系统实验

    一.input 子系统简介 input 就是输入的意思,因此 input 子系统就是管理输入的子系统,是 Linux 内核针对某一类设备而创建的框架. 比如按键输入.键盘.鼠标.触摸屏等等这些都属于输 ...

  8. saiku+kettle整合(八)saiku展示改善

    title: saiku+kettle整合(八)saiku展示改善 tags: OLAP categories: saiku date: 2016-08-25 18:18:54 saiku展示改善 开 ...

  9. Python游戏开发,pygame模块,Python实现八音符小游戏

    开发工具** Python版本:3.6.4 相关模块: cocos2d模块: pyaudio模块: 以及一些Python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模 ...

最新文章

  1. css中overflow:hidden的属性 可能会导致js下拉菜单无法显示
  2. 网络营销——网络营销专员到底是教你如何选择网站页面制作
  3. Xilinx Platform Cable USB II 下载器驱动安装教程——Win10
  4. kafka logstash elk
  5. silverlight游戏在坑内发展
  6. Java 并没有死!
  7. 下拉树取值与赋值单元格填报(取值赋值)
  8. ubuntu 安装GPU黑屏 修改GRUB_安装Ubuntu 18.04系统的相关注意事项,及解决Ubuntu 双系统黑屏问题...
  9. 使用$.getJSON解决ajax跨域访问 JQuery 的跨域方法(服务器端为wordpress程序)
  10. vasp 计算杨氏弹性_高阶弹性常数计算的一点建议
  11. 有关第四章css的介绍
  12. CVX约束中需要使用一些中间变量该怎么办
  13. Android事件总线 EventBus3.0用法学习
  14. 软件工程师的试炼之地:53道Python面试问答
  15. 原件常识:以“光”为传媒的光电耦合器
  16. 残差(residual)
  17. java输出GPA,简单的C GPA计算器问题
  18. Visio2013 取消箭头的自动连接
  19. 蓝桥杯刷题冲刺 | 倒计时20天
  20. 亲,你的浏览器过时了,请立即更换Chrome浏览器。

热门文章

  1. AutowareAuto泊车案例复现及原理简介
  2. Java毕设项目教育培训机构信息管理系统计算机(附源码+系统+数据库+LW)
  3. 基于caffe的鉴黄图片分类c++代码
  4. 2012-9-20nbsp;《考研词汇速记024》
  5. windows server 2012/2016 设置多用户远程桌面
  6. Diopter mac版(AE光线折射朦胧模糊插件)
  7. svn开分支合分支实例说明
  8. SpringBoot中@SpringBootApplication注解的三体结构解析
  9. 魅族持续交付平台建设实践
  10. 线性时间选择求第k小数(分治)