随笔分类 - Linux系统编程笔记
摘要:61.1 介绍 守护进程(daemon)是生存期长的一种进程。它们常常在系统引导装入时启动,在系统关闭时终止 守护进程也称为后台进程 所有守护进程都以超级用户(用户 ID 为0)的优先权运行。 守护进程没有控制终端 守护进程的父进程都是 init 进程 62.2 例子 62.2.1 编程步骤 使用
阅读全文
摘要:60.1 介绍 60.2 例子 echo_tcp_server_select.c 编译运行测试:
阅读全文
摘要:59.1 介绍 前面介绍的函数如,recv、send、read 和 write 等函数都是阻塞性函数,若资源没有准备好,则调用该函数的进程将进入阻塞状态。我们可以使用 I/O 多路复用来解决此问题(即解决并发)。 I/O 多路复用的方式主要有两种实现方法 fcntl 函数实现(非阻塞方式) sele
阅读全文
摘要:58.1 广播介绍 58.1.1 介绍 广播实现一对多的通讯 它通过向广播地址发送数据报文实现的 58.1.2 套接字选项 套接字选项用于修饰套接字以及其底层通讯协议的各种行为。函数 setsockopt 和 getsockopt 可以查看和设置套接字的各种选项。 optname 选项 SO_BRO
阅读全文
摘要:57.1 介绍 57.1.1 域名解析 57.1.2 域名解析函数 gethostent 可以获取多组,gethostbyname 只可以获取一组 /etc/hosts 文件设置了域名和 IP 的绑定关系 57.2 例子 57.2.1 例子1 gethost.c 修改下 /etc/hosts 文件,
阅读全文
摘要:56.1 UDP 编程模型 56.1.1 编程模型 UDP 协议称为用户数据报文协议,可靠性比 TCP 低,但执行效率高 56.1.2 API (1)发送数据 函数参数: sockfs:套接字文件描述符 buf:发送的数据 len:发送的数据的大小,即多少个字节 flags:一般设置为0 dest_
阅读全文
摘要:55.1 TCP 连接和关闭过程 55.1.1 介绍 建立连接的过程就是三次握手的过程:客户端发送 SYN 报文给服务器,服务器回复 SYN+ACK 报文,客户机再发送 ACK 报文。 关闭连接的过程:客户机先发送 FIN 报文,服务器回复 ACK 报文,服务器再发送 FIN 报文,客户机再发送响应
阅读全文
摘要:54.1 编程模型介绍 54.1.1 TCP 客户端服务器编程模型 客户端调用序列 调用 socket 函数创建套接字 调用 connect 连接服务器端 调用 I/O 函数(read/write) 与服务器端通讯 调用 close 关闭套接字 服务器端调用序列 调用 socket 函数创建套接字
阅读全文
摘要:53.1 socket 套接字 53.1.1 介绍 Socket(套接字)是一种通讯机制,它包含一整套的调用接口和数据结构的定义,它给应用进程提供了使用如 TCP/UDP 灯网络协议进行网络通讯的手段 Linux 中的网络编程通过 socket 接口实现,socket 既是一种特殊的 IO,提供对应
阅读全文
摘要:52.1 网络介绍 使用远程资源 共享信息、程序和数据 分布处理 52.1.1 协议的概念 计算机网络中实现通信必须有一些约定,如对速率、传输代码、代码结构、传输控制步骤和出错控制等约定,这些约定即被称为通信协议 在两个节点之间要成功地进行通信,两个节点之间必须约定使用共同的“语言”,这些被通信各方
阅读全文
摘要:51.1 进程信号量 51.1.1 信号量 本质上就是共享资源的数目,用来控制对共享资源的访问 用于进程间的互斥和同步 每种共享资源对应一个信号量,为了便于大量共享资源的操作引入了信号量集,可对所有信号量一次性操作。对信号量集中所有操作可以要求全部成功,也可以部分成功 二元信号量(信号灯)值为 0
阅读全文
摘要:50.1 共享内存 50.1.1 共享内存的概念 共享内存区域是被多个进程共享的一部分物理内存 多个进程都可把该共享内存映射到自己的虚拟内存空间。所有用户空间的进程若要操作共享内存,都要将其映射到自己虚拟内存空间中,通过映射的虚拟内存空间地址去操作共享内存,从而达到进程间的数据通信 共享内存是进程间
阅读全文
摘要:49.1 System V IPC 介绍 49.1.1 System V IPC 概述 UNIX 系统存在信号、管道和命名管道等基本进程间通讯机制 System V 引入了三种高级进程间通信机制 消息队列、共享内存和信号量 IPC 对象(消息队列、共享内存和信号量)存在于内核中而不是文件系统中,由用
阅读全文
摘要:48.1 标准库中的管道操作 48.1.1 标准库中的管道操作 函数说明: 使用 popen() 创建的管道必须使用 pclose() 关闭。其实,popen/pclose 和标准文件输入/输出流中的 fopen()/fclose 十分相似。 封装管道的常用操作 返回值: popen:成功,返回文件
阅读全文
摘要:47.1 协同进程 47.1.1 介绍 两个进程通过两个管道进行双向通信称为协同进程。 47.1.2 例子 co_process.c add.c 先编译 add.c ,再编译 co_process.c,运行结果如下: 47.2 读写特性 47.2.1 介绍 通过打开两个管道来创建一个双向管道 管道是
阅读全文
摘要:46.1 管道介绍 46.1.1 管道通信 管道是针对于本地计算机的两个进程之间的通信而设计的通信方法,建立管道后,实际获得两个文件描述符:一个用于读取而另一个用于写入 最常见的 IPC 机制,通过 pipe 系统调用 管道是单工的,数据只能向一个方向流动,需要双向通信时,需要建立起两个管道 数据的
阅读全文
摘要:45.1 进程间通信要达到的目的 数据传输 一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间 共享数据 多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到 通知事件 一个进程需要向另一个或一组进程发送消息,通知(它们)发生了某种事件(如进程终止时要通
阅读全文
摘要:44.1 死锁 死锁: 两个线程试图同时占有两个资源,并按不同的次序锁定相应的共享资源 解决方式: 按相同的次序锁定相应的共享资源 使用函数 pthread_mutex_trylock(),它是函数 pthread_mutex_lock() 的非阻塞版本 两个线程试图同时占有两个资源,并按不同的次序
阅读全文
摘要:43.1 信号量 43.1.1 信号量介绍 信号量从本质上是一个非负整数计数器,是共享资源的数目,通常被用来控制对共享资源的访问 信号量可以实现线程的同步和互斥 通过 sem_post() 和 sem_wait() 函数对信号量进行加减操作从而解决线程的同步和互斥 信号量数据类型:sem_t 43.
阅读全文
摘要:42.1 线程状态转换 42.1.1 状态转换图 42.1.2 一个线程计算,多个线程获取的案例 编译运行结果如下: 42.2 读者-写者案例 几种情况: 1 个写者,1 个读者 1 个写者,多个读者 多个写者,多个读者 1 个写者,1 个读者 1 个写者,多个读者 多个写者,多个读者 完成第一种情
阅读全文