![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
《unix环境高级编程》
玛丽奥ZJY
这个作者很懒,什么都没留下…
展开
-
Linux信号量同步共享内存实验.
简述本文主要内容是自己对信号量和共享内存系统函数的整理,及简单使用,以方便以后可能再次使用的情况.也可以为比较熟悉信号量和共享内存的人方便的回忆使用方法.实验简述.1.本实验程序有两个进程,一个写,一个读.2.写进程不断向创建的共享内存写数据.3.读进程通过getchar()共享内存的最新数据.4.读写共享内存时通过信号量同步.信号量和共享内存的系统函数信号量系统函数及接口#include "sem.h" #include "debug.h" ...原创 2020-05-19 17:53:00 · 376 阅读 · 0 评论 -
UNIX环境编程学习笔记(1):——出错处理errno
1. errno变量文件 中定义了符号 errno 以及可以赋予它的各种常量,这些常量都是以字符 E 开头。例如,若 errno 等于常量 EACCES,表示产生了权限问题(例如,没有打开所要求文件的足够权限)。当 UNIX 函数出错时,常常返回一个负值,而且将整型变量 errno 设置成含有附加信息的各个常量。例如,open 函数如果成功执行则返回一个非负文件描述符,如出错转载 2017-08-31 14:16:32 · 284 阅读 · 0 评论 -
UNIX环境编程学习笔记(3)——文件I/O之内核 I/O 数据结构
内核使用三种数据结构表示打开的文件,分别是文件描述符表、文件表和 V 节点表。(1) 每个进程在进程表中都有一个记录项,记录项中包含有一张打开文件描述符表,每个描述符占用一项。与每个文件描述符相关联的是: (a) 文件描述符标志。 (b) 指向一个文件表项的指针。(2) 内核为所有打开文件维持一张文件表。每个文件表项包含: (a) 文件状态转载 2017-08-31 16:00:26 · 313 阅读 · 0 评论 -
UNIX环境编程学习笔记(4)——文件I/O之dup复制文件描述符
UNIX 提供了两个函数 dup 和 dup2 用于复制一个现存的文件描述符。#include int dup(int filedes);int dup2(int filedes, int filedes2);返回值:若成功则返回新的文件描述符,如出错则返回-1.由 dup 函数返回的文件描述符一定是当前可用文件描述符中的最小描述符。用 dup2 函数则可以通过参数转载 2017-08-31 16:12:07 · 303 阅读 · 0 评论 -
UNIX环境编程学习笔记(5)——文件I/O之fcntl函数访问已打开文件的性质
fcntl 函数可以改变已打开的文件的性质。#include int fcntl(int filedes, int cmd, ... /* int arg */);fcntl 函数有 5 种功能:1. 复制一个现有的描述符(cmd=F_DUPFD)。2. 获取/设置文件描述符标志(cmd=F_GETFD 或F_SETFD)。3. 获取/设置文件状态标转载 2017-08-31 16:32:20 · 225 阅读 · 0 评论 -
UNIX环境编程学习笔记(2)——文件I/O之不带缓冲的 I/O
1 文件描述符对于内核而言,所有打开的文件都通过文件描述符引用。文件描述符是一个非负整数。当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。当读或写一个文件时,使用 open 或 creat 返回的文件描述符标识该文件,将其作为参数传送给 read 或 write。按照惯例,UNIX 系统 shell 使用文件描述符 0 与进程的标准输入相关联,文件描述符 1 与转载 2017-08-31 16:33:42 · 266 阅读 · 0 评论 -
UNIX环境编程学习笔记(6)——文件I/O之判断文件类型
1 文件类型我们平时最常接触的文件类型有普通文件(regular file)和目录(di-rectory file),但是 UNIX 系统提供了多种文件类型:(1) 普通文件(regular file)这种文件包含了某种形式的数据,这些数据无论是文件还是二进制对于 UNIX 内核而言都是一样的。对普通文件内容的解释有处理该文件的应用程序进行。(2) 目录文件(dir转载 2017-08-31 17:02:09 · 527 阅读 · 0 评论 -
UNIX环境编程学习笔记(7)——文件I/O之文件访问权限与进程访问控制
1 文件的设置用户 ID位 和设置组 ID位与进程相关联的 ID 如下表所示,表 1: 与进程相关联的用户 ID 和组 ID实际用户 ID我们实际上是谁实际组 ID有效用户 ID用于文件访问权限检查有效组 ID附加组 ID保存的设置用户 ID由 exec 函数保存转载 2017-08-31 18:05:42 · 337 阅读 · 0 评论 -
UNIX环境编程学习笔记(8)——文件I/O之校验当前登录用户对文件的访问权限
通过前面一篇随笔(文件访问权限与进程访问控制),我们知道内核校验文件的访问权限使用的是进程的有效用户 ID 和有效组 ID。但有时我们需要知道当前登录用户对某个文件访问权限。虽然说进程的有效用户 ID 和有效组 ID 通常分别等于当前登录用户 ID 和用户所在组 ID。例如,一个进程可能因设置用户 ID 以另一个用户权限运行,它仍可能想验证当前实际登录的用户是否能否访问一个给定的文件。转载 2017-09-01 09:36:24 · 280 阅读 · 0 评论 -
UNIX环境编程学习笔记(9)——文件I/O之文件访问权限的屏蔽和更改
1 文件访问权限在文件访问权限和进程访问控制中,我们已经讲述过文件访问权限位,为了方便,我们重新列在下面, 表 1: 文件的 9 个访问权限位 st_mode 屏蔽 意义 S_IRUSR 用户 -读 S_IWUSR 用户 -写 S_IXUSR 用户 -执行 S_I转载 2017-09-01 09:37:23 · 348 阅读 · 0 评论 -
UNIX环境编程学习笔记(10)——文件I/O之硬链接和符号链接
1 文件系统数据结构UNIX 文件系统通过 i 节点来存储文件的信息。如图 1 所示为一个磁盘柱面上的 i 节点和数据块示意图。其中 i 节点是一个固定长度的记录项,它包含了有关文件的大部分信息。数据块用于存储文件的实际内容。每个文件的 i 节点会记录该文件的内容所占用的数据块信息。图 1: i 节点和数据块图 1 中还有一些信息需要进行说明:1. 每个目录转载 2017-09-01 09:38:03 · 546 阅读 · 0 评论 -
UNIX环境编程学习笔记(11)——文件I/O之文件时间以及 utime 函数
1 文件的时间每个文件都有三个时间字段,如表 1 所示。表 1: 文件的三个时间字段说明字段st_atime文件数据的最后访问时间st_mtime文件数据的最后修改时间st_ctimei 节点状态的最后更改时间最后修改时间是文件内容最后一次被修改的时间。更改状态时间是转载 2017-09-01 10:43:50 · 304 阅读 · 0 评论 -
UNIX环境编程学习笔记(12)——文件I/O之目录操作
1 引言在 UNIX 系统中,目录是一种特殊的文件类型。我们可以使用 open 函数来打开目录,获取文件描述符,然后调用 stat 函数来获取目录的属性信息,但是我们却不能够使用 read 函数来读取目录内容。例如,下面例子所示,#include #include #include #include string.h>#include #include #inclu转载 2017-09-01 13:55:34 · 281 阅读 · 0 评论 -
UNIX环境编程学习笔记(13)——文件I/O之标准I/O流
1 标准 I/O 流之前学习的都是不带缓冲的 I/O 操作函数,直接针对文件描述符的,每调用一次函数可能都会触发一次系统调用,单次调用可能比较快捷。但是,对于需要频繁进行 I/O 操作的程序,频繁触发系统调用产生的消耗太大。标准 I/O 库提供了带缓冲的 I/O 操作函数,这些函数围绕着一种叫做流(stream)的东西进行。当使用标准 I/O 库打开或创建一个文件时,系统提供了一个转载 2017-09-03 11:01:15 · 269 阅读 · 0 评论 -
Linux下syslog日志函数使用
许多应用程序需要记录它们的活动。系统程序经常需要向控制台或日志文件写消息。这些消息可能指示错误、警告或是与系统状态有关的一般信息。例如,su程序会把某个用户尝试得到超级用户权限但失败的事实记录下来。通常这些日志信息被记录在系统文件中,而这些系统文件又被保存在专用于此目的的目录中。它可能是/usr/adm或/var/log目录。对一个典型的Linux安装来说,文件 /var/log/messag...转载 2019-01-05 09:20:04 · 3352 阅读 · 1 评论 -
APUE.3e 安装(基于ubuntu12.0.4)
本菜刚刚学习UNIX下高级编程,无奈搭建本书编程环境时遇到不少问题。幸好网上有各种大神的解决办法让我最终解决了问题。在这里感谢为LINUX开源操作系统奋斗的大神。不过话说回来,网上大都是针对UNIX高级编程第二版的头文件搭建,现在对于第三版来说,有些过时,因为很对针对linux的make文件已经改变了很多。话不多说,下面就来看看具体的搭建过程:(本人用的操作系统是ubuntu 14.04L...转载 2018-04-09 17:11:18 · 155 阅读 · 0 评论 -
Linux进程间通信——使用信号量
http://blog.csdn.net/ljianhui/article/details/10243617这篇文章将讲述别一种进程间通信的机制——信号量。注意请不要把它与之前所说的信号混淆起来,信号与信号量是不同的两种事物。有关信号的更多内容,可以阅读我的另一篇文章:Linux进程间通信——使用信号。下面就进入信号量的讲解。一、什么是信号量为了防止出现因多转载 2017-08-31 11:03:42 · 204 阅读 · 0 评论 -
一个Linux下C线程池的实现(转)
1.线程池基本原理 在传统服务器结构中, 常是 有一个总的 监听线程监听有没有新的用户连接服务器, 每当有一个新的 用户进入, 服务器就开启一个新的线程用户处理这 个用户的数据包。这个线程只服务于这个用户 , 当 用户与服务器端关闭连接以后, 服务器端销毁这个线程。然而频繁地开辟与销毁线程极大地占用了系统的资源。而且在大量用户的情况下, 系统为了开辟和销毁线程将浪费大量的时间和资源。线程转载 2017-08-30 15:16:54 · 217 阅读 · 0 评论 -
UNIX环境编程学习笔记(28)——多线程编程(三):线程的取消
1 取消线程pthread 提供了pthread_cancel 函数用于请求取消同一进程中的其他线程。#include int pthread_cancel(pthread_t tid);返回值:若成功则返回0,否则返回错误编码pthread_cancel 调用并不会立即终止目标线程,而只是向目标线程发出取消请求。调用线程不等待目标线程终止,在默认情况下,目标线转载 2017-09-05 20:22:17 · 213 阅读 · 0 评论 -
Linux下配置APUE的编译 报错之后如何处理
APUE即Unix环境高级编程,本书中几乎所有的程序都包含一个apue.h的头文件,那如何配置这个apue.h呢?官方地址:http://www.apuebook.com/apue3e.html1、我们可以在src.3e.tar中下载,然后放到你的Linux桌面上(没桌面的,随意放吧)2、解压下载的文件:tar -zxv -f src.3e.tar.gz3、进入解压后的目录转载 2017-08-14 17:16:58 · 518 阅读 · 0 评论 -
UNIX环境编程学习笔记(14)——文件I/O之临时文件
ISO C 标准 I/O 库提供了个两个函数 tmpnam 和 tmpfile 以帮助创建临时文件,#include char *tmpnam(char *ptr);返回值:指向唯一路径名的指针tmpnam 函数产生一个与现有文件名不同的一个有效路径名字符串。每次调用它时,它都产生一个不同的路径名,最多调用次数是TMP_MAX。TMP_MAX 定义在 中。若转载 2017-09-04 09:40:31 · 209 阅读 · 0 评论 -
UNIX环境编程学习笔记(15)——进程管理之进程终止
1 进程的终止方式进程的终止方式有 8 种,其中 5 种为正常终止,它们是1. 从 main 返回。2. 调用 exit。3. 调用_exit 或_Exit。4. 最后一个线程从其启动例程返回。5. 最后一个线程调用pthread_exit。另外三种为异常终止方式,它们是1. 调用 abort。2. 接到一个信号并终止。转载 2017-09-04 10:03:38 · 220 阅读 · 0 评论 -
UNIX环境编程学习笔记(16)——进程管理之进程环境变量
1 环境表和环境指针在每个进程启动时,都会接到一张环境表。环境表是一个字符指针数组,其中每个指针包含一个以 null 结束的 C 字符串的地址。全局变量environ 则包含了该指针数组的地址,extern char **environ;例如,图 1 显示了包含有 5 个环境字符串的环境表,图 1: 含有 5 个环境字符串的环境表2 环境变量转载 2017-09-04 11:00:35 · 213 阅读 · 0 评论 -
UNIX环境编程学习笔记(17)——进程管理之进程的几个基本概念
1 main 函数是如何被调用的?在编译 C 程序时,C 编译器调用链接器在生成的目标可执行程序文件中,设置一个特殊的启动例程为程序的起始地址。当内核执行 C 程序时,在调用 main 前先调用这个特殊的启动例程,该启动例程从内核取得命令行参数和环境变量值。2 共享库共享库使得可执行文件中不再需要包含共用的库例程,而只需在所有进程都可引用的存储区中维护这种库例程的一个副本。转载 2017-09-04 15:41:06 · 254 阅读 · 0 评论 -
UNIX环境编程学习笔记(18)——进程管理之进程控制三部曲
1 进程控制三部曲概述UNIX 系统提供了 fork、exec、exit 和 wait 等基本的进程控制原语。通过这些进程控制原语,我们即可完成对进程创建、执行和终止等基本操作。进程的控制可以划分为三部曲,• 第一部:fork 创建新进程。• 第二部:exec 执行新程序。• 第三部:exit 和 wait 处理终止和等待终止。2 第一部:fork 创建新进转载 2017-09-04 16:29:49 · 331 阅读 · 0 评论 -
UNIX环境编程学习笔记(19)——进程管理之fork 函数的深入学习
在“进程控制三部曲”中,我们学习到了 fork 是三部曲的第一部,用于创建一个新进程。但是关于 fork 的更深入的一些的东西我们还没有涉及到,例如,fork 创建的新进程与调用进程之间的关系、父子进程的数据共享问题等。fork 是否可以无限制的调用?如果不行的话,最大限制是多少?另外,我们还将学习一个 fork 的变体 vfork。1 fork 创建的新进程与调用进程之间的关系转载 2017-09-04 16:49:28 · 259 阅读 · 0 评论 -
UNIX环境编程学习笔记(20)——进程管理之exec 函数族
在文档“进程控制三部曲”中,我们提到 fork 函数创建子进程之后,通常都会调用 exec 函数来执行一个新程序。调用 exec 函数之后,该进程就将执行的程序替换为新的程序,而新的程序则从 main 函数开始执行。UNIX 提供了 6 种不同的 exec 函数供我们使用。它们的原型如下所示,#include int execl(const char *pathname, co转载 2017-09-04 17:29:13 · 241 阅读 · 0 评论 -
UNIX环境编程学习笔记(21)——进程管理之获取进程终止状态的 wait 和 waitpid 函数
当一个进程正常或者异常终止时,内核就向其父进程发送 SIGCHLD信号。父进程可以选择忽略该信号,或者提供一个该信号发生时即被调用的函数(信号处理程序)。对于这种信号的系统默认动作是忽略它。在文档“进程控制三部曲”中,我们讲的第三部曲是使用 wait 函数来获取终止子进程的终止状态。那么,有几个问题我们这里需要详细的学习一下。1. 父进程一定能够获取到子进程的终止状态吗?如果子进程转载 2017-09-04 18:12:59 · 275 阅读 · 0 评论 -
UNIX环境编程学习笔记(22)——进程管理之system 函数执行命令行字符串
ISO C 定义了 system 函数,用于在程序中执行一个命令字符串。其声明如下,#include int system(const char *cmdstring);system 函数在其实现中调用了 fork、exec 和 waitpid 函数。system 函数调用 fork 函数创建子进程,然后由子进程调用’/bin/sh -c cmdstring’ 来执行命令行转载 2017-09-05 08:40:49 · 699 阅读 · 0 评论 -
UNIX环境编程学习笔记(23)——信号处理初步学习
1 信号的概念维基百科中关于信号的描述是这样的:在计算机科学中,信号(英语:Signals)是 Unix、类 Unix 以及其他 POSIX 兼容的操作系统中进程间通讯的一种有限制的方式。它是一种异步的通知机制,用来提醒进程一个事件已经发生。当一个信号发送给一个进程,操作系统中断了进程正常的控制流程,此时,任何非原子操作都将被中断。如果进程定义了信号的处理函数,那么它将被执行,否则转载 2017-09-05 09:15:16 · 304 阅读 · 0 评论 -
UNIX环境编程学习笔记(24)——信号处理进阶学习之信号集和进程信号屏蔽字
1 信号传递过程信号源为目标进程产生了一个信号,然后由内核来决定是否要将该信号传递给目标进程。从信号产生到传递给目标进程的流程图如图 1 所示,图 1: 信号产生、传递到处理的流程图进程可以阻塞信号的传递。当信号源为目标进程产生了一个信号之后,内核会执行依次执行下面操作,1. 如果目标进程设置了忽略该信号,则内核直接将该信号丢弃。2. 如果目标进程没转载 2017-09-05 16:11:13 · 296 阅读 · 0 评论 -
UNIX环境编程学习笔记(25)——信号处理进阶学习之 sigaction 函数
sigaction 函数跟 signal 函数一样,用于设置信号处理函数。此函数是用于取代 UNIX 早期版本使用的 signal 函数。UNIX 早期版本的 signal 函数在捕获到一个信号之后,就会自动将该信号的处理动作恢复为默认处理动作。于是,如果我们希望注册的信号处理函数长期生效,则需要在信号处理程序中再次调用 signal 函数注册一次。这样的操作太麻烦,而且在信号处理函数中再次调用转载 2017-09-05 16:43:56 · 261 阅读 · 0 评论 -
UNIX环境编程学习笔记(26)——多线程编程(一):创建和终止线程
在进程控制三部曲中我们学习了进程的创建、终止以及获取终止状态等的进程控制原语。线程的控制与进程的控制有相似之处,在表 1中我们列出了进程和线程相对应的控制原语。表 1: 进程原语和线程原语的比较进程原语线程原语描述forkpthread_create创建新的控制流exitpthread_exit转载 2017-09-05 17:09:55 · 271 阅读 · 0 评论 -
UNIX环境编程学习笔记(27)——多线程编程(二):控制线程属性
1 线程属性概括POSIX 线程的主要属性包括 scope 属性、detach 属性、堆栈地址、堆栈大小、优先级。在头文件 pthread.h 中定义了结构体pthread_attr_t 来记录线程的属性。在创建线程的函数pthread_create 的第二个参数 attr 就是一个pthread_attr_t结构体的指针,通过该参数,我们可以控制新创建的线程的属性。如果 atrr转载 2017-09-05 17:50:12 · 286 阅读 · 0 评论 -
APUE.3e 安装(基于ubuntu12.0.4)
搭建本书编程环境时遇到不少问题。幸好网上有各种大神的解决办法让我最终解决了问题。在这里感谢为LINUX开源操作系统奋斗的大神。不过话说回来,网上大都是针对UNIX高级编程第二版的头文件搭建,现在对于第三版来说,有些过时,因为很对针对linux的make文件已经改变了很多。话不多说,下面就来看看具体的搭建过程:(本人用的操作系统是ubuntu 14.04LTS)1.在网上下载转载 2017-08-14 17:12:48 · 290 阅读 · 0 评论