![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
UNIX环境高级编程
文章平均质量分 83
思翊
Hello , world.
展开
-
UNIX环境高级编程-第3章- 文件I/O
3.1 引言 文件I/O可分为两类:第一类是非缓冲式的文件操作;该类型一般由系统调用,主要函数有open,write,read,lseek,close;第二类是缓冲式文件操作;该类型由标准输入输出提供操作;本文记录的是第一类文件I/O。3.2 文件描述符 内核通过文件描述符打开的文件,它是一个非负整数。通常,文件描述符0对应标准输入;文件描述符1对应标准输出;原创 2014-12-16 16:04:52 · 536 阅读 · 0 评论 -
UNIX环境高级编程-第17章- 高级进程间通信 - 一
17.1 引言 前面两章介绍了UNIX系统提供的各种IPC,包括管道和套接字。本章介绍两种高级IPC:基于STREAM的管道和UNIX域套接字,并说明它们的应用方法。前面介绍的管道是半双工管道,本章基于 STREAMS 的管道是属于全双工的管道,半双工和全双工管道的区别如下:半双工只能在一端进行读或写;全双工可以在某一端同时进行读写; 17.2 基于 STREAMS原创 2015-01-14 16:09:19 · 659 阅读 · 0 评论 -
UNIX环境高级编程-第10章- 信号 - 一
10.2 信号基本概念 信号本质是在软件层次上对中断机制的一种模拟,即软件中断;在原理上,一个进程收到一个信号或处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,进程也不知道信号到底什么时候到达。信号是进程间通信机制中唯一的异步通信机制,可以看作是异步通知,通知接收信号的进程有哪些事情发生了。 信号事件的发生有原创 2014-12-24 16:49:21 · 478 阅读 · 0 评论 -
UNIX环境高级编程-第18章- 终端 I/O
18.2 终端综述终端 IO 是一种字符型设备,终端特殊设备文件一般有以下几种:串行端口终端:是使用计算机串行端口连接的设备,计算机把每个串行端口都看作是一个字符设备。串行端口所对应的设备名称 /dev/ttySn(n表示从0开始的整数);伪终端:是成对的逻辑终端设备,例如 /dev/ptyp3 和/ dev/ttyp3(在设备文件系统中分别是 /dev/pty/m3 和/ dev原创 2015-01-15 15:36:13 · 467 阅读 · 0 评论 -
UNIX环境高级编程-第4章- 文件和目录 - 二
4.8 umask函数当创建新文件是可以通过umask函数指定文件的访问权限。以下是文件权限值对应的数字:读R——数字4;写W——数字2;执行X——数字1; /************************** * 函数功能:为进程设置文件模式创建屏蔽字,并返回以前的值; * 函数原型: * * mode_t umask (mode_t cmask);原创 2014-12-17 16:31:20 · 581 阅读 · 0 评论 -
UNIX环境高级编程-第5章- 标准 I/O 库
5.2 流和 FILE 对象 前面介绍的《文件I/O》都是针对文件描述符进行操作的,并且是非缓冲区方式的。本节记录的标准I/O的操作是在流进行的,当用标准I/O打开或创建一个文件时,已使一个流与一个文件相关联。 标准I/O文件的流可用于单字节或多字节(宽)字符集。流的定向决定所读、写的字符是单字节还是多字节。流最初被创建时,并没有定向,若在未定向的流上使用一个多字节I/O函数,原创 2014-12-19 15:23:49 · 489 阅读 · 0 评论 -
UNIX环境高级编程-第0章- 关于apue.h和源码编译问题
《unix高级环境编程》这本书的源码下载连接http://www.apuebook.com/,这里有几个版本,根据需要下载。 为了能够方便学习,在你的编译环境能够使用apue.h这个头文件(这个头文件是作者自行编写的),所以我们必须要编译源码,使我们能够使用该头文件。编译的过程中会报错,这里列出我编译过程过解决错误的过程。 在进行make编译之前,准备工作的工作原创 2014-12-15 17:46:35 · 510 阅读 · 0 评论 -
关于线程编程中“undefined reference to 'pthread_create'等问题的解决
今天学习UNIX环境高级编程第11章中的线程编程,在编译第一个demo时,出现了“undefined reference to ‘pthread_create’”这种错误导致无法编译通过。问题的原因:pthread 库不是 Linux 系统默认的库,连接时需要使用静态库 libpthread.a,所以在使用pthread_create()创建线程,以及调用 pthread_atfork()原创 2015-01-04 14:35:59 · 869 阅读 · 0 评论 -
UNIX环境高级编程-第11章- 线程 - 一
chenchenis 每个线程都有一个线程ID,线程ID只在它所题目:思路:djadgadfgadfadgadfhgadfhfgadfgadfgadgerghadfgfgadg原创 2015-01-04 13:54:59 · 532 阅读 · 0 评论 -
UNIX环境高级编程-第12章- 线程控制 - 一
12.3 线程属性在创建新的线程时,我们可以使用系统默认的属性,也可以自己指定线程的主要属性。我们可以指定 pthread_attr_t 结构修改线程的默认属性,并把这个属性与创建线程联系起来。下面先看下线程的主要属性:/* 线程属性 */ /* * 线程的主要属性: * (1)detachstate 线程的分离状态属性; * (2)guardsize原创 2015-01-06 16:04:39 · 463 阅读 · 0 评论 -
I/O多路复用技术之 - poll
1、基本知识 poll的机制与select类似,与select在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是poll没有最大文件描述符数量的限制。poll和select同样存在一个缺点就是,包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,而不论这些文件描述符是否就绪,它的开销随着文件描述符数量的增加而线性增大。2、poll函数 函数原创 2015-01-24 15:56:30 · 463 阅读 · 0 评论 -
I/O多路复用技术之 - epoll
1、基础知识 epoll是在2.6内核中提出的,是之前的select和poll的增强版本。相对于select和poll来说,epoll更加灵活,没有描述符限制。epoll使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy只需一次。2、epoll接口 epoll操作过程需要三个接口,分别如下:#include原创 2015-01-24 15:57:01 · 678 阅读 · 0 评论 -
UNIX环境高级编程-第14章- 高级 I/O - 一
14.2 非阻塞I/O非阻塞 I/O 使我们可以调用 open、write 和 read 这样的 I/O 操作,并使这些操作不会永远阻塞。如果这种操作不能完成,则立即出错返回,表示该操作若继续执行将阻塞。对于一个给定的文件描述符由以下两种方法可以对其指定非阻塞 I/O:(1)若调用 open 获得描述符,则可指定 O_NONBLOCK 标志;(2)对已打开的描述符,可以使用 fcn原创 2015-01-08 17:07:58 · 504 阅读 · 0 评论 -
关于fork 的一个小问题
首先看一个程序:题目:请问下面的程序一共输出多少个“-”?#include #include #include int main(void){ int i; for(i=0; i<2; i++){ fork(); printf("-"); } wait(NULL); wait(NULL); return 0;转载 2015-03-31 19:57:52 · 799 阅读 · 0 评论 -
UNIX环境高级编程-第10章- 信号 - 二
10.15 sigsetjmp和siglongjmp 函数7.10节介绍了两个关于用于非局部跳转的 setjmp 和 longjmp 函数,在信号处理程序中经常调用 longjmp 函数以返回到程序的主循环中,而不是从该处理程序返回。但是调用 longjmp 有一个问题,当捕捉到一个信号时,进入信号捕捉函数,此时当前信号被自动加到进程的信号屏蔽字中。这阻止了后来产生的这种信号中断该信号处理程序原创 2014-12-25 16:27:48 · 535 阅读 · 0 评论 -
UNIX环境高级编程-第9章- 进程关系
9.4 进程组 在UNIX 系统中,每个进程除了自己的进程 ID之外,还属于一个进程组。进程组是一个进程或多个进程的集合,进程组本身也有属于自己的进程组ID,进程组属于一个会话,fork()并不改变进程组ID。进程组组长: 进程ID与进程组ID相等的进程。组长可以改变子进程的进程组ID,使其转移到另一进程组。组长进程可以在所在的进程组创建进程,然后终止,从进程组创建开始到原创 2014-12-23 17:11:47 · 709 阅读 · 0 评论 -
UNIX环境高级编程-第16章- 网络IPC:套接字 - 一
16.1 引言 在前面部分介绍的:管道、FIFO、消息队列、信号量和共享内存都是同一台计算机上的进程间通信,本节介绍的套接字是可以实现不同计算机之间的远程进程间通信。套接口是网络进程的 ID,在网络中每一个节点都有一个网络地址,也就是 IP 地址,两个进程间通信时,首先要确定各自所在网络节点的网络地址。但是,网络地址只要确定进程所在的计算机,由于一台计算机上同时可能有多个网络进程,原创 2015-01-12 15:56:17 · 581 阅读 · 0 评论 -
UNIX环境高级编程-第4章- 文件和目录 - 一
4.2 stat,lstat 和fstat函数/*********************** * 函数功能: 描述文件属性 * stat函数返回与pathname命名文件的相关信息结构; * fstat函数获取已在描述符filedes上打开的文件信息; * lstat函数获取符号连接的相关信息; * * 返回值:若成功则返回0,若出错则返回-1; * 函数原型:原创 2014-12-16 17:30:47 · 515 阅读 · 0 评论 -
UNIX环境高级编程-第11章- 线程 - 二
11.5 线程终止 在进程中,若调用了函数 exit,_exit,或_Exit 时,则该进程会终止,同样,若进程中的线程调用这三个函数时也会使线程所在的进程终止。那么要是只是退出线程,而不终止线程所在的进程有什么办法?下面是在单线程模式下退出线程的三种方式(不会终止线程所在的进程):(1)线程只是从启动例程中返回,返回值是线程的退出码;(2)线程被同一进程的其他线程取消;原创 2015-01-05 17:42:19 · 491 阅读 · 0 评论 -
UNIX环境高级编程-第12章- 线程控制 - 二
12.6 线程私有属性进程中的所有线程都可以访问进程的整个地址空间,一个线程真正拥有的唯一私有存储是处理器寄存器,甚至栈地址也能被共享,底层实现也没有阻止这种访问。但处理线程私有数据的函数可以提高线程间数据的独立性,维护基于每个线程的数据。 在需要一个变量时,如果所有线程共享相同的值,则可以使用静态或外部数据,就像在单线程程序中那样,但通常需要互斥量来同步跨越多个线程对共享数原创 2015-01-07 16:08:04 · 447 阅读 · 0 评论 -
UNIX环境高级编程-第13章- 守护进程
13.1 引言 守护进程也称为精灵进程(daemon),是一种生存期较长的一种进程。它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。他们常常在系统引导装入时启动,在系统关闭时终止。unix系统有很多守护进程,大多数服务器都是用守护进程实现的,例如inetd守护进程。13.2 守护进程的特征用ps命令察看一些常用的系统守护进程,看一下他们和几个概念:进程组、控制终端原创 2015-01-08 15:47:32 · 508 阅读 · 0 评论 -
UNIX环境高级编程-第4章- 文件和目录 - 三
前言 在Linux系统中利用ln指令产生链接,Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln命令产生硬链接。硬链接 硬链接是一种通过文件系统的inode链接产生,硬链接可以认为是一个指针,指向文件inode的指针,系统并不为它重新分配inode。所以存在多个文件指向同一个原创 2014-12-18 15:58:48 · 433 阅读 · 0 评论 -
UNIX环境高级编程-第14章- 高级 I/O - 二
14.4 STREAMS STREAMS(流)是系统 V 提供的构造内核设备驱动程序和网络协议包的一种通用方法。流在用户进程和设备驱动程序之间提供了一条全双工通路,下面是流在用户进程和设备驱动程序之间的流图:写到流首的数据将顺流而下传送,由设备驱动程序读到的数据则逆流向上传送;STREAMS 消息 STREAMS 的所有输入和输出都是基于消息,流首和用户进程原创 2015-01-09 15:37:20 · 564 阅读 · 0 评论 -
UNIX环境高级编程-第6章- 系统数据文件和信息
6.2 口令文件口令文件的结构/* The passwd structure. */ struct passwd { char *pw_name; /* Username. */ char *pw_passwd; /* Password. */ uid_t pw_uid; /* User ID. *原创 2014-12-19 17:18:28 · 490 阅读 · 0 评论 -
UNIX环境高级编程-第15章- 进程间通信 - 一
15.1 引言进程通信(IPC)是处理一个多进程系统中各个进程之间的协调。进程通信就是指多个进程之间相互通信、交换信息的方法。进程通信的目的如下:(1)数据传输:一个进程需要将它的数据发送给另一个进程;(2)共享数据:多个进程操作共享数据,若其中一个进程修改了共享数据,则其他进程立即可以看到修改后的数据;(3)通知事件:一个进程要向另一个或一组进程发送消息,通知它们发生了某种事,例原创 2015-01-10 15:51:33 · 637 阅读 · 0 评论 -
UNIX环境高级编程-第15章- 进程间通信 - 二
15.6 XSI IPC有三种IPC我们称作XSI IPC,即消息队列,信号量和共享存储器,他们之间有很多相似之处。15.6.1 标识符和键每个内核中的IPC结构(消息队列,信号量或共享存储段)都用一个非负整数的标识符加以引用。标识符是IPC对象的内部名,为使多个合作进程能够在同一IPC对象上会合。需要提供一个外部名方案。为此使用了键(key),每个IPC对象都与一个键相关联,于是键就原创 2015-01-11 15:50:02 · 585 阅读 · 0 评论 -
UNIX环境高级编程-第7章- 进程环境
7.2 main 函数 C程序总是从 main 函数开始执行。main 函数的原型是 int main ( int argc , char * argv[] );其中,argc 是命令行参数的数目,argv 是指向参数的各个指针所构成的数组。当内核执行C程序时(使用一个exec函数执行),在调用mian函数前先调用一个特殊的启动例程。可执行程序文原创 2014-12-20 16:05:44 · 622 阅读 · 0 评论 -
UNIX环境高级编程-第8章- 进程控制 - 一
8.3 fork 函数在 UNIX 系统中,一个现有进程可以调用 fork 函数创建一个新进程。调用 fork 函数的进程称为父进程,由 fork 创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次,两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。首先看下fork函数的原型;/* 创建进程 */ /* fork 函数 */原创 2014-12-21 17:11:36 · 616 阅读 · 0 评论 -
UNIX环境高级编程-第8章- 进程控制 - 二
8.10 exec函数exec 替换进程映像 在进程的创建上 UNIX 采用了一个独特的方法,它将进程创建与加载一个新进程映象分离,这样可以方便对两种操作进行管理。当创建了一个进程之后,通常可以用 exec 系列的函数将子进程替换成新的进程映象。当然,exec 系列的函数也可以将当前进程替换掉。exec 序列函数 fork 函数创建一个子进程时,几乎复制原创 2014-12-22 16:18:03 · 506 阅读 · 0 评论 -
UNIX环境高级编程-第16章- 网络IPC:套接字 - 二
在基于 TCP 的通信连接请求过程有三次握手,其过程如下所示: 第一次握手:客户端发送syn包(seq=x)到服务器,并进入SYN_SEND状态,等待服务器确认; 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握原创 2015-01-13 15:49:15 · 722 阅读 · 6 评论 -
I/O多路复用技术之 - select
当我们想要多次对描述符进行read 时,多路转接技术能够满足该要求。I/O 多路转接技术首先构造一张有关描述符的列表,然后调用一个函数,直到这些描述符中的一个已准备好进行 I/O 时,该函数才返回,返回时,告诉进程哪些描述符已经准备好可以进行 I/O 操作。1、基本概念 IO多路复用是指内核一旦发现进程指定的一个或者多个I/O条件准备读取,它就通知该进程。IO多路复用适用如下场合:原创 2015-01-24 14:58:33 · 594 阅读 · 0 评论