
Unix/Linux系统编程
文章平均质量分 81
Unix/Linux系统编程,记录日常学习笔记
lingqing97
这个作者很懒,什么都没留下…
展开
-
《Unix环境高级编程》chapter16 网络IPC:套接字
文章目录chapter16 网络IPC:套接字套接字描述符寻址建立连接数据传输带外数据chapter16 网络IPC:套接字套接字描述符为创建一个套接字,调用socket函数/*domain: 通信域type: 套接字类型protocol: 协议*/int socket(int domain,int type,int protocol); //若成功,返回文件(套接字)描述符套接字通信域分为:域描述AF_INETIPv4因特网域AF_INET6IPv原创 2021-05-18 11:32:42 · 380 阅读 · 1 评论 -
《Unix环境高级编程》chapter15 进程间通信
文章目录chapter15 进程间通信引言管道FIFOXSI IPC消息队列信号量共享存储POSIX信号量chapter15 进程间通信引言进程间通信(InterProcess Communication ,IPC),包括管道、命名管道(FIFO)和XSI IPC的三种形式IPC(消息队列、信号量和共享存储),以及POSIX提供的替代信号量机制。管道//创建管道int pipe(int fd[2]); //fd[0]为读端,fd[1]为写端所有UNIX系统都提供了管道通信,管道有以下两原创 2021-05-11 11:00:22 · 441 阅读 · 0 评论 -
《Unix环境高级编程》chapter13 守护进程
文章目录chapter13 守护进程守护进程编写规则出错记录chapter13 守护进程守护进程(daemon)是生存期长的一种进程,它们常常在系统引导装入时启动,仅在系统关闭是才终止。注意,大多数守护进程都以超级用户(root)特权运行。所有的守护进程都没有控制终端,其终端名设置为问号。最后,应当引起注意的是用户层守护进程的父进程是init进程。守护进程编写规则在编写守护进程程序时需遵循一些基本规则:首先要做的是调用umak将文件模式创建屏蔽字设置为一个已知值(通常是0)调用fork,然后原创 2021-04-23 11:58:07 · 263 阅读 · 0 评论 -
《Unix环境高级编程》chapter14 高级I/O
文章目录chapter14 高级I/O非阻塞I/O记录锁I/O多路转接POSIX异步I/O函数readv和writev存储映射I/Ochapter14 高级I/O非阻塞I/O非阻塞I/O使我们可以发出open、read和write这样的I/O操作,并使这些操作不会永远阻塞。如果这种操作不能完成,则调用立刻出错返回,表示该操作如继续执行将阻塞。对于一个给定的描述符,有两种为其指定非阻塞I/O的方法:如果调用open获得描述符,则可指定O_NONBLOCK标志对于已经打开的一个描述符,则可调用fc原创 2021-04-23 11:56:13 · 343 阅读 · 0 评论 -
《Unix环境高级编程》chapter12 线程控制
文章目录chapter12 线程控制线程属性线程特定数据同步属性重入例子:getenv的线程安全版本chapter12 线程控制线程属性每个线程对象可以关联一个属性对象,该属性对象通过初始化函数初始化,通过销毁函数销毁,可以通过相关取值/设值函数读取/修改属性值。#include<pthread.h>//两个函数的返回值:若成功,返回0;否则,返回错误编号int pthread_attr_init(pthread_attr_t* attr) //初始化线程属性in原创 2021-04-14 22:17:29 · 270 阅读 · 0 评论 -
《Unix环境高级编程》chapter11 线程
文章目录chapter11 线程线程概念线程标识线程创建实例:打印线程ID线程终止实例:获取线程退出状态线程同步互斥量实例: 使用互斥量保护数据结构读写锁(也叫做共享互斥锁)条件变量实例:使用条件变量自旋锁屏障乐观锁与悲观锁chapter11 线程线程概念每个线程都包含表示执行环境所必需的信息,其中包括进程中标识线程的线程ID、一组寄存器值、栈、调度优先级和策略、信号屏蔽字、errno变量以及线程私有数据。一个进程的所有信息对该进程的所有线程都是共享的,包括可执行程序的代码、程序的全局内存和堆内存、原创 2021-04-02 11:05:27 · 324 阅读 · 0 评论 -
《Unix环境高级编程》chapter10 信号
文章目录chapter10 信号信号概念函数signal实例:捕捉SIGUSR1和SIGUSR2的简单程序不可靠信号可重入函数可靠信号术语和语义函数kill和raise函数alarm和pause信号集、函数sigprocmask和函数sigpending实例:为进程打印信号屏蔽字实例:信号设置和sigprocmask实例函数sigsetjmp和siglongjmp实例:使用siglongjmp恢复信号屏蔽字函数abort函数sleep作业控制信号常见信号总结chapter10 信号信号概念信号是软件中原创 2021-04-01 20:40:06 · 215 阅读 · 0 评论 -
《Unix环境高级编程》chapter09 进程关系
文章目录chapter09 进程关系终端登录网路登录进程组会话作业控制shell执行顺序孤儿进程组例子chapter09 进程关系终端登录大多数Linux系统的终端登录方式与BSD终端登录方式大同小异,这里以BSD终端登录为例进行说明.对于上图有以下几点需要注意:当系统自举后,内核创建进程ID为1的进程,也就是init进程:init进程使系统进入多用户模式,init读取文件/etc/ttys,对每一个运行登录的终端设备,init调用一次fork,它所生成的子进程则exec getty程序ge原创 2021-03-23 12:11:41 · 160 阅读 · 1 评论 -
《Unix环境高级编程》chapter08 进程控制(二)
chapter08 进程控制(二)章节知识总结如前面所述,不管进程如何终止,最后都会执行内核中的同一段代码,这段代码为相应进程关闭所有打开描述符,释放它所使用的存储器等。这里对子进程与父进程的结束顺序进行相关讨论:子进程后于父进程结束:对于父进程已经终止的所有进程,它们的父进程都改变为init进程。我们称这些进程由init进程收养。其操作过程大致是:在一个进程终止时,内核逐个检查所有活动进程,以判断它是否是正要终止进程的子进程,如果是,则该进程的父进程ID就更改为1(init进程的ID),这样就原创 2021-03-22 10:56:05 · 119 阅读 · 0 评论 -
《Unix环境高级编程》chapter08 进程控制(一)
chapter08 进程控制(一)章节知识总结每个进程都有一个非负整型表示的唯一进程ID,且进程ID是复用的。当一个进程终止后,其进程ID就成为复用的候选者,大多数UNIX系统实现延迟复用算法,使得赋予新建进程的ID不同于最近终止进程所使用的ID。系统中有一些专用进程:ID为0的进程通常是调用进程,常常被称为交换进程(swapper),该进程是内核的一部分,它并不执行任何磁盘上的程序,因此也被称为系统进程;ID为1的进程是init进程,在自举过程结束时由内核调用。获取进程ID的相关函数如下:#in原创 2021-03-19 23:18:02 · 136 阅读 · 0 评论 -
《Unix环境高级编程》 chapter07 进程环境
chapter07 进程环境章节知识总结在Unix中有8种方式使进程终止,其中5种为正常终止,它们是:从main返回;调用exit;调用_exit或_Exit最后一个线程从其启动例程返回从最后一个线程调用pthread_exit异常终止有3种方式,它们是:调用abort接到一个信号最后一个线程对取消请求做出响应exit、_exit、_Exit这3个函数用于正常终止一个程序,而exit则现在执行一些清理处理,然后返回内核。这3个退出函数都带一个整型参数,称为终止状态(或退出状态原创 2021-03-19 10:20:08 · 221 阅读 · 0 评论 -
《Unix环境高级编程》chapter06 系统数据文件和信息
chapter06 系统数据文件和信息最近发现APUE实在是太难”啃“了,打算尝试用一种新的方式看这本书,现忽略一些不重要的函数调用,主要关注理论知识。重点知识UNIX系统的正常运行需要使用大量与系统有关的数据文件,比如口令文件、组文件等口令文件在POSIZ.1中也被称为用户数据库,口令文件是/etc/passwd,而且是一个ASCII文件,其中各字段之间用冒号分割,包括用户名、加密口令(现在普遍不将加密口令放在口令文件中)、数值用户ID、数值组ID等信息与口令文件相关的函数如下:#includ原创 2021-03-17 23:23:12 · 164 阅读 · 0 评论 -
《Unix环境高级编程》chapter05 标准I/O库
chapter05 标准I/O库理论知识在前面的第3章中,所有I/O函数都是围绕文件描述符的。当打开一个文件时,即返回一个文件描述符,然后该文件描述符就用于后续的I/O操作。而对于标准I/O库,它们的操作是围绕流进行的。当用标准I/O库打开或创建一个文件时,我们已使一个流与一个文件相关联。(可以通过fileno获取与其关联的文件描述符)流的定向决定了所读、写的字符是单字节还是多字节的。当一个流最初被创建时,它没有定向,可以通过函数fwide设置流的定向。当通过函数fopen打开一个流时,返回一个指向原创 2021-03-16 23:28:07 · 123 阅读 · 0 评论 -
《Unix环境高级编程》chapter04 文件和目录(二)
文章目录chapter04 文件和目录(二)函数chown,fchown,fchownat和lchown文件长度文件截断文件系统函数link、linkat、unlink、unlinkat和remove实例:打开一个文件,然后unlink它函数rename和renameat符号链接创建和读取符号链接文件的时间函数futimens、utimensat和utimes函数mkdir、rmdir、opendir和readdir设备特殊文件打印设备号chapter04 文件和目录(二)函数chown,fchown,原创 2021-03-16 23:24:53 · 362 阅读 · 0 评论 -
《Unix环境高级编程》chapter04 文件和目录(一)
文章目录chapter04 文件和目录(一)函数stat,fstat,fstatat和lstat文件类型实例:通过定义的宏判断文件类型设置用户ID和设置组ID文件访问权限新文件和目录的所有权函数access和faccessat实例:access函数实例函数umask实例:umask函数实例函数chmod、fchmod和fchmodat粘着位chapter04 文件和目录(一)函数stat,fstat,fstatat和lstat通过stat,fstat,fstatat和stat四个函数可以返回文件的详细原创 2021-03-13 20:32:24 · 293 阅读 · 0 评论 -
《Unix环境高级编程》chapter03 文件I/O
chapter03 文件I/O引言UNIX系统中的大多数文件I/O只需用到5个函数:open,read,write,lseek以及close,这些函数经常被称为不带缓冲的I/O(unbuffered I/O).术语不带缓冲指的是每个read和write都调用内核中的一个系统调用。这些不带缓冲的I/O函数不是ISO C的组成部分,但是,它们是POSIX.1和Single UNIX Specification的组成部分.文件描述符对于内核而言,所有打开的文件都通过文件描述符引用。文件描述符是一个非负整原创 2021-03-12 21:00:15 · 167 阅读 · 0 评论 -
《Unix环境高级编程》chapter02 UNIX标准及实现
chapter02 UNIX标准及实现限制ISO CISO C标准的意图是提供C程序的可移植性,ISO C标准现在由ISO/IEC的C程序设计语言国际标准工作组维护和开发。IEEE POSIXPOSIX是一个最初由IEEE(Institute of Electrical and Electronics Engineers,电气和电子工程师学会)制定的标准族。POSIX原来指的只是IEEE标准1003.1-1988(操作系统接口),后来则扩展成包括很多标记为1003的标准和标准草案。2001年的10原创 2021-03-11 22:56:17 · 134 阅读 · 0 评论 -
《Unix环境高级编程》chapter01 UNIX基础知识
chapter01 UNIX基础知识UNIX系统结构从严格意义上来说,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境,我们通常将这种软件称为内核(kernel)。登录用户登录UNIX系统时,先键入登录名,然后键入口令。系统再其口令(通常是/etc/passwd文件)中查看登录名。口令文件中的登录项由7个以冒号分隔的字段组成,依次是:登录名、加密口令、数字用户ID、数字组ID、注释字段、起始目录以及shell程序(/bing/ksh).shell是一个命令行解释器。系统从口令原创 2021-03-11 10:08:00 · 177 阅读 · 0 评论 -
《Unix/Linux编程实践教程》chapter15 进程间通信(IPC)
chapter15 进程间通信(IPC)章节知识总结Unix系统提供了系统调用select来从多个数据源读取数据,它允许程序挂起,并等待从不止一个文件描述符的输入,它的原理很简单:获得所需要的文件描述符列表将此列表传给selectselect挂起直到任何一个文件描述符有数据到达select设置一个变量中的若干位,用力啊通知你哪一个文件描述符已经有输入的数据使用select的小demo如下:#include<stdio.h>#include<sys/time.h>原创 2021-03-08 19:55:25 · 198 阅读 · 0 评论 -
《Unix/Linux编程实践教程》chapter14 线程机制:并发函数的使用
chapter14 线程机制:并发函数的使用章节知识总结多个线程在一个单独的进程中运行,共享全局变量,因此线程间可以通过设置和读取这些全局变量来进行通信。线程的执行顺序是无法预测的。下面是一个多线程的例子:#include<stdio.h>#include<pthread.h>#define NUM 5void* print_msg(void*);int main(){ pthread_t pid1,pid2; pthread_create(&a原创 2021-03-08 19:53:58 · 129 阅读 · 0 评论 -
《Unix/Linux编程实践教程》chapter13 基于数据报的编程:编写许可证服务器
chapter13 基于数据报的编程:编写许可证服务器章节知识总结流socket传送数据就像电话网中传送声音一样,客户先建立连接,然后使用该连接进行单向、双向或类似管道的字节流传送。数据报通信则与从一个邮箱到另一个邮箱发送包裹类似。客户不必建立连接,只要想特定的地址发送消息,而服务器进程在该进程接受消息。流socket使用的网络协议叫TCP即传输控制挟制(Transmission Control Protocol)。数据报socket叫UDP即用户数据协议(User Datagram Protoco原创 2021-03-08 19:53:00 · 188 阅读 · 0 评论 -
《Unix/Linux编程实践教程》chapter12 连接和协议:编写Web服务器
chapter12 连接和协议:编写Web服务器章节知识总结基于socket的客户/服务器系统处理流程如下图所示:服务器的设计有两种方式:自己做(DO It Yourself,DIY):服务器接收请求,自己处理工作代理:服务器接收请求,然后创建一个新进程来处理工作其中,自己做用于快速简单的任务,代理用于慢速的更加复杂的任务。一个使用代理的服务器如下所示:#include<stdio.h>#include<unistd.h>#include<signal原创 2021-03-06 22:48:33 · 189 阅读 · 0 评论 -
《Unix/Linux编程实践教程》chapter11 连接到近端或远端的进程:服务器与Socket(套接字)
chapter11 连接到近端或远端的进程:服务器与Socket(套接字)章节知识总结Unix提供一个接口(read和write)来处理来自不同数据源的数据:磁盘/设备文件:用open命令连接,用read和write传递数据管道:用pipe命令创建,用fork共享,用read和write传递数据Sockets:用socket、listen和connect连接,用read和write传递数据fdopen与fopen类似,返回一个FILE*类型的值,不同的是此函数以文件描述符而非文件作为参数,f原创 2021-03-02 23:27:28 · 170 阅读 · 0 评论 -
《Unix/Linux编程实践教程》chapter10 I/O 重定向和管道
chapter10 I/O 重定向和管道章节知识总结所有的Unix工具都使用文件描述符0,1和2。标准输入文件的描述符是0,标准输出文件的描述符是1,而标准错误输出的文件描述符则是2。Unix假设文件描述符0、1、2已经被打开,可以分别进行读、写和写的操作了。所谓文件描述符,是一个数组的索引号。每个进程都有其打开的一组文件。这些打开的文件被保持在一个数组中。文件描述符即为某文件在数组中的索引。最低可用文件描述符:当打开文件时,为此文件安排的描述符总是此数组中最低可用位置的索引。将stdin重定向到原创 2021-03-01 17:30:55 · 193 阅读 · 0 评论 -
《Unix/Linux编程实践教程》chapter9 可编程的shell、shell变量和环境
chapter9 可编程的shell、shell变量和环境章节知识总结Unix shell运行一种称为脚本的程序,一个shell脚本可以运行程序、接受用户输入、使用变量和使用复杂的控制逻辑。if…then语句依赖于下述惯例:Unix程序返回0以表示成功。shell使用wait来得到程序的退出状态。Unix允许用户在环境中以变量的形式存放个性化设置。环境是每个程序都可以存取的一个字符串数组。每个数组中的字符串都以var=value这样的形式出现,数组的地址被存放在一个名为environ的全局变量里。原创 2021-03-01 17:29:17 · 131 阅读 · 0 评论 -
《Unix/Linux编程实践教程》chapter8 进程和程序:编写命令解释器sh
chapter8 进程和程序:编写命令解释器sh章节知识总结一个程序时存储在文件中的机器指令序列。一般它是由编译器将源代码编译成二进制格式的代码。运行一个程序意味着将这个机器指令序列载入内存然后让处理器逐条执行这些指令。每个进程都有一个可以唯一标识它的数字,被称为进程ID。Unix系统中的内存分为系统空间和用户空间。进程存在于用户空间。建立一个进程有点像建立一个磁盘文件,内核要找到一些用来存放程序指令和数据的空闲内存页,内核还要建立数据结构来存放相应的内存分配情况和进程属性。一个命令解释器sh的原创 2021-02-27 21:57:28 · 135 阅读 · 0 评论 -
《Unix/Linux编程实践教程》chapter7 事件驱动编程
chapter7 事件驱动编程章节知识总结curses库是一组函数,程序员可以用它们来设置光标的位置和终端屏幕上显示的字符样式。一个小的demo如下:#include<stdio.h>#include<curses.h>//在终端显示"Hello world"int main(){ initscr(); clear(); move(10,20); addstr("Hello world"); move(LINES-1,0);原创 2021-02-27 15:12:59 · 235 阅读 · 0 评论 -
《Unix/Linux编程实践教程》chapter6 为用户编程:终端控制和信号
chapter6 为用户编程:终端控制和信号章节知识总结软件工具从标准输入读取字节,进行一些处理,然后将包含结果的字节流写到标准输出。工具发送错误消息到标准错误输出,它们也被当做简单的字节流来处理。终端驱动程序完成缓冲、回显、编辑和控制键处理等操作。缓冲和编辑包含在规范处理,当这些特征被启动,终端连接被称为处于规范模式。规范模式,也被称为cooked模式,是用户常见的模式。驱动程序输入的字符保存在缓冲区,并且仅在接受到回车键时才将这些缓冲的字符发送到程序。缓冲数据使驱动程序可以实现最基本的编辑功原创 2021-02-27 15:11:20 · 157 阅读 · 0 评论 -
《Unix/Linux编程实践教程》chapter5 连接控制:学习stty
chapter5 连接控制:学习stty章节知识总结对于Unix来说,声卡、终端、鼠标和磁盘文件是同一种对象。在Unix系统中,每个设备都被当做一个文件。每个设备都有一个文件名、一个i-节点号、一个文件所有者、一个权限位的集合和最近修改时间。按传统定义,终端是键盘和显示单元,但实际可能包括打印机等.终端最重要的功能就是接受来自用户的字符输入和将输出信息显示给用户。相比于普通文件的属性,设备文件比较特殊的地方在于:设备文件的i-节点存储的是指向内核子程序的指针,而不是文件的大小和存储列表设备文原创 2021-02-25 10:58:30 · 174 阅读 · 0 评论 -
《Unix/Linux编程实践教程》chapter4 文件系统
chapter4文件系统章节知识总结一个磁盘可以被划分成分区,每个分区都可以被看做是一个独立的磁盘。一个硬盘由一些磁性盘片组成,每个盘片的表面都被划分为很多同心圆,这些同心圆称作磁道,每个磁道又进一步被划分成扇区.扇区是磁盘上的基本存储单元,现在的磁盘包含大量的扇区。磁盘上存储数据的软件给磁盘上每条磁道上的每个块分配了一个序号,文件系统将被编号的磁盘块划分为3部分:超级块:用来存放文件系统本身的信息(这些信息包括未使用的磁盘块的信息等)i-节点表(inode table):用来存放文件属性数原创 2021-02-25 10:56:04 · 162 阅读 · 0 评论 -
《Unix/Linux编程实践教程》chapter3 目录与文件属性
chapter3 目录与文件属性章节知识总结磁盘上有文件和目录,文件和目录都有内容和属性(目录其实也可以看做一个文件)。文件的内容可以是任意的数据,目录的内容只能是文件名/子目录名的列表。对于操作系统(例如内核)而言,文件名前面的"."没有任何特殊的含义,它只对ls的使用者有意义。磁盘上的文件和目录被组织成一棵目录树,每个节点都是目录或文件,甚至光盘这些移动存储介质也被挂到文件树的某一个子目录来处理。目录中文件名/子目录名指向文件和其他的目录,内核提供了系统调用过来读取目录的内容、读取和修改文件的原创 2021-02-23 21:46:50 · 154 阅读 · 0 评论 -
《Unix/Linux编程实践教程》chapter2 用户、文件操作与联机帮助
chapter2 用户、文件操作与联机帮助章节知识总结who命令通过读取系统日志(UTMP_FILE文件)的内容显示当前已经登录的用户.Unix系统把数据存放在普通文件中,可以通过以下系统调用操作文件:open(filename,how):how为打开方式(O_RDONLY,O_WRONLY,O_RDWR三种方式)creat(filename,mode):mode为创建的文件的权限,该权限只是给系统的建议,实际权限由系统的umask决定read(fd,buffer,amt):amt为读取的si原创 2021-02-23 21:23:15 · 182 阅读 · 0 评论 -
《Unix/Linux编程实践教程》chapter1 Unix系统编程概述
chapter1 Unix系统编程概述系统编程概述用来容乃操作系统的内存空间叫做系统空间,容纳应用程序的内存空间叫做用户空间。(操作系统也被称为内核).什么是系统编程呢?编写普通程序时可以认为,程序时直接连接到键盘、显示器、磁盘等设备的,但在进行系统编程时,必须对系统的结构和工作方式有更深的了解,要知道内核提供哪些服务(系统调用),如何使用它们,系统有哪些资源和设备,不同的资源和设备该如何操作。系统资源一般有:处理器:处理器时执行指令的硬件设备输入输出(I/O)进程管理内存设备计时器原创 2021-02-23 21:21:46 · 225 阅读 · 0 评论