《unix环境高级编程二》
文章平均质量分 63
玛丽奥ZJY
这个作者很懒,什么都没留下…
展开
-
《UNIX环境高级编程》笔记51--线程的同步
多个线程共享相同的内存时,需要确保每个线程看到一致的数据视图。1.互斥量可以通过使用pthread的互斥接口保护数据,确保同一时间只有一个线程访问数据,互斥量(mutex)从本质上说是一把锁,在访问共享资源前对互斥量进行枷锁,在访问完成后释放互斥量上的锁。对互斥量进行加锁后,任何其他试图再次对互斥量进行加锁的线程将被阻塞知道当前线程释放该互斥锁。如果释放互斥锁时有多个线程阻塞,所有在该互斥锁上阻塞...转载 2018-04-17 10:15:07 · 153 阅读 · 0 评论 -
《UNIX环境高级编程》笔记73--特殊输入字符
POSIX.1定义了11个在输入是做特殊处理的字符。实现定义了另外一些特殊字符。下表摘要列出了这些特殊字符。POSIX.1允许禁用这些字符。若将c_cc数组中的某项设置为_POSIX_VDISABLE的值,则禁用相应的特殊字符。可以使用tcsetattr函数进行操作。使用函数tcgetattr和tcsetattr可以获得或设置termios结构。[cpp] view plain copy#incl...转载 2018-04-21 20:11:47 · 164 阅读 · 0 评论 -
《UNIX环境高级编程》笔记72--终端IO
终端IO有两种不同的工作模式:1.规范模式输入处理。在这种模式中,终端输入以行为单位进行处理。对于每个读要求,终端驱动程序最多返回一行。例如,若shell把标准输入重定向到终端,2.非规范模式输入处理。输入字符并不组成行。终端设备是由一般位于内核中的终端驱动程序控制的。每个终端设备有一个输入队列和一个输出队列。大多数UNIX系统在一个称为终端行规程(terminal line discipline...转载 2018-04-21 20:11:41 · 214 阅读 · 0 评论 -
《UNIX环境高级编程》笔记71--UNIX域套接字
1.非命名的UNIX域套接字UNIX套接字用于在用一台机器上运行的进程之间通信。UNIX套接字比因特网域套接字的效率更高。UNIX与套接字提供和数据报两种接口,UNIX域数据报服务是可靠的,就不会丢失消息也不会传递出错。UNIX域套接字是套接字和管道之间的混合物。为了创建一对非命名的,相互连接的UNXI域套接字,用户可以使用socketopair函数。[cpp] view plain copy#i...转载 2018-04-21 20:11:31 · 144 阅读 · 0 评论 -
《UNIX环境高级编程》笔记70--套接字选项,带外数据
1.套接字选项套接字机制提供两个套接字选项接口来控制套接字行为。一个接口用来设置选项,另一个接口允许查询一个选项的状态。可以获取或设置三种选项:1.通用选项,工作在所有套接字类型上。2.在套接字层次管理的选项,但是依赖于下层协议的支持。3.特定于某协议的选项,为每个协议独立。SUS仅定义了套接字层的选项。(1和2)可以采用setsockopt函数来设置套接字选项。[cpp] view plain ...转载 2018-04-18 10:39:38 · 164 阅读 · 0 评论 -
《UNIX环境高级编程》笔记69--套接字数据传输
套接字端点表示为文件描述符,只要建立连接,就可以使用read和write来通过套接字通信。在套接字描述符上采用read和write是非常有意义的,因为可以传递套接字描述符到那些原来设计为处理本地文件的函数。而且可以安排传递套接字描述符到执行程序的子进程,该子进程并不解释套接字。但是如果想指定选项,从多个客户端接受数据报或者发送带外数据,则需要采用六个传递数据的套接字函数中的一个。最简单的send,...转载 2018-04-18 10:39:30 · 162 阅读 · 0 评论 -
《UNIX环境高级编程》笔记68--套接字描述符、寻址、建立连接
1.套接字描述符套接字是通信端点的抽象。与应用程序使用文件描述符访问文件一样,访问套接字也需要用套接字描述符。要创建一个套接字,可以调用socket函数。[cpp] view plain copy#include<sys/socket.h> int socket(int domain, int type, int protocol); //成功返回套接字描述符,出错返回-1. d...转载 2018-04-18 10:39:23 · 225 阅读 · 0 评论 -
《UNIX环境高级编程》笔记52--线程属性
在之前调用pthread_create函数的例子中,传入的参数都是空指针,而不是指向pthread_attr_t结构的指正,可以使用pthread_attr_t结构修改线程默认属性,并把这些属性与创建的线程联系起来。可以使用pthread_attr_init函数初始化pthread_attr_t结构。调用pthread_attr_init后,pthread_attr_t结构所包含的内容就是操作系统...转载 2018-04-17 10:15:30 · 127 阅读 · 0 评论 -
《UNIX环境高级编程》笔记50--线程的标识、创建和终止
1.线程标识就像每个进程都有一个进程ID一样,每个线程都有一个线程ID。进程ID在整个系统中是唯一的,但线程ID只在它所属的进程环境中有效。线程ID使用pthread_t数据类型来表示,实现的时候可以使用一个结构来表示pthread_t数据类型,所以可移植的操作系统实现不能将它比作整数处理。因此必须使用函数来对比线程ID进行比较。[cpp] view plain copy#include <...转载 2018-04-17 10:14:43 · 142 阅读 · 0 评论 -
《UNIX环境高级编程》笔记49--sigsuspend函数
更改进程的信号屏蔽字可以阻塞所选择的信号,或解除对它们的阻塞,使用这种技术可以保护不希望由信号中断的代码临界区。如果希望对一个信号解除阻塞,然后pause等待以前被阻塞的信号发生,将如何呢?假定信号是SIGINT,实现这一点的一种不正确的方法是:[cpp] view plain copysigset_t newmask,oldmask; sigemptyset(&newmask); ...转载 2018-04-15 20:15:17 · 161 阅读 · 0 评论 -
《UNIX环境高级编程》笔记48--sigsetjmp和siglongjmp函数
setjmp和longjmp函数用于非局部跳转,在信号处理程序中经常调用longjmp函数以返回到程序的主循环中,而不是从该处理程序返回。但是调用longjmp有一个问题,当捕捉到一个信号时,进入进行处理函数,此时当前信号被自动加到进程的信号屏蔽字中。这阻止了后来产生的这种信号中断该信号处理程序。如果用longjmp跳出信号处理程序,那么对此进程的信号屏蔽字会发生什么呢?POSIX.1并没有说明s...转载 2018-04-15 20:15:12 · 197 阅读 · 0 评论 -
《UNIX环境高级编程》笔记47--sigaction函数
sigaction函数的功能是检查或修改指定信号相关联的处理动作,此函数取代UNIX早期版本使用的signal函数。[cpp] view plain copy#include<signal.h> int sigaction(int signo, const struct sigaction *restrict act, struct sigaction *restrict oact)...转载 2018-04-15 20:15:06 · 198 阅读 · 1 评论 -
《UNIX环境高级编程》笔记46--信号集
1.信号集基本操作我们需要有一个能表示多个信号--信号集(signal set)的数据类型。POSIX.1定义了数据类型sigset_t以包含一个信号集,并且定义了一下五个处理信号处理信号集函数。[cpp] view plain copy#include <signal.h> int sigemptyset(sigset_t *set); //清除set中所有的信号 int s...转载 2018-04-15 20:15:01 · 126 阅读 · 0 评论 -
《UNIX环境高级编程》笔记45--kill函数,raise函数,alarm函数,pause函数
1.kill函数和raise函数kill函数将信号发送给进程或者进程组,raise函数则运行进程向自身发送信号。[cpp] view plain copy#include <signal.h> int kill(pid_t pid,int signo); int raise(int signo); //若成功,则返回0,出错则返回-1. 调用raise(signo);等价于调用...转载 2018-04-15 20:14:54 · 128 阅读 · 0 评论 -
《UNIX环境高级编程》笔记44--可靠信号
在产生信号时,内核通常在进程表中设置某一种形式的标志。当对信号采取了这种动作时,我们说向进程递送了一个信号。在信号产生和递送之间的时间间隔内,称信号是未决的。进程可以选用信号递送阻塞。如果为进程产生了一个选择为阻塞的信号,而且对该进程的动作是默认动作或捕捉该信号,则为该进程将次信号保持为未决状态,直到该进程(1)对此信号解除了阻塞,或者(2)将次信号的动作更改为忽略。内核在递送一个原来被阻塞的信号...转载 2018-04-15 20:14:47 · 124 阅读 · 0 评论 -
《UNIX环境高级编程》笔记43--中断的系统调用
1.信号概念信号是软件中断,很多比较重要的应用程序都需要处理信号。信号提供了一种处理异步事件的方法。在有文件<signal.h>中,这些信号被定义为正整数。不存在信号为0的信号。很多条件可以产生信号:1.当用户按某些终端键时,引发终端产生的信号。在终端上按ctrl+c键,通常产生中断信号(SIGINT)。2.硬件异常产生信号:除数为0,无效的内存引用等等。这些条件由硬件检测到,并将其通...转载 2018-04-15 20:14:39 · 154 阅读 · 0 评论 -
《UNIX环境高级编程》笔记53--线程私有数据
版权声明:本文为博主原创文章,未经博主允许不得转载。线程私有数据时存储和查询与某个线程相关的数据的一种机制。把这种数据成为线程私有数据或线程特定数据的原因是,希望每个线程都可以独立地访问数据副本,并不需要担心与其他线程的同步访问问题。为什么要使用线程私有数据呢?原因有两个:1.有时候需要维护基于每个线程的数据,因为线程ID并不能保证是小而连续的整数,所以不能简单地分配一个线程数据数组,用线程ID作...转载 2018-04-17 10:15:35 · 142 阅读 · 0 评论 -
《UNIX环境高级编程》笔记54--同步属性
1.互斥量属性用pthread_mtexattr_init初始化pthread_mutexattr_t结构,用pthread_mutexattr_destroy对该结构进行回收。[cpp] view plain copy#include<pthread.h> int pthread_mutexattr_init(phtread_mutexattr_t *attr); int pth...转载 2018-04-17 10:15:41 · 138 阅读 · 0 评论 -
《UNIX环境高级编程》笔记55--线程的取消选项
有两个线程并没有包含在pthread_attr_t机构中,他们是可取消状态和可取消类型,这两个属性影响着线程在响应pthread_cancel函数调用时所呈现的行为。可取消状态属性可以是PTHREAD_CANCEL_ENABLE和PTHREAD_CANCEL_DISABLE,线程可以通过调用pthread_setcancelstate修改它的可取消状态。[cpp] view plain copy#...转载 2018-04-17 10:15:48 · 187 阅读 · 0 评论 -
《UNIX环境高级编程》笔记75--行控制函数、终端标识、终端窗口大小
1.行控制函数下列4个函数提供了终端设备的行控制能力,其中,参数filedes引用一个终端设备,否则出错返回,errno设置为ENOTTY。[cpp] view plain copy#include<termios.h> int tcdrain(int filedes); int tcflow(int filedes, int action); int tcflush(int f...转载 2018-04-21 20:11:59 · 199 阅读 · 0 评论 -
《UNIX环境高级编程》笔记76--规范模式和非规范模式
1.规范模式规范模式很简单:发一个读请求,输入完一行后,终端驱动程序即返回。(终端的行缓冲应该就是通过终端IO函数来实现的)下列几个条件都会造成读返回。1.所要求的字节数已读到时,读返回。无需读一个完整的行。如果读了部分行,那么也不会丢失任何信息,下一次读从前一次读的停止处开始。2.但读到一个定界符时,读返回。在规范模式中下列字符为解释成行结束:NL、EOL、EOL2和EOF。转载 2017-09-19 18:41:08 · 215 阅读 · 0 评论 -
《UNIX环境高级编程》笔记77--伪终端
1.什么是伪终端伪终端对于一个程序来说,看上去像一个终端,但事实上并不是一个真正的终端。下图显示了使用伪终端时相关进程的典型结构。1.通常一个进程打开伪终端主设备,然后调用fork。子进程建立了一个新的会话,打开一个相应的伪终端从设备,将其文件描述符复制到标准输入、标准输出和标准出错,然后调用exec。伪终端从设备成为子进程的控制终端。2.对于伪终端从设备之上的用户进程转载 2017-09-19 18:43:01 · 270 阅读 · 0 评论 -
《UNIX环境高级编程》笔记60--非阻塞IO
系统调用分成低速系统调用和其他系统调用两类。低速系统调用是可能会使进程永远阻塞的一类调用调用,他们包含:如果某些文件类型(例如管道,终端设备和网络设备)的数据并不存在,则读操作可能会使调用者永远阻塞。如果数据不能立即被上述相同类型的文件接受(由于在管道中无空间,网络流控制等),则写操作也会使调用者永远阻塞。在某些条件发生之前,打开某些类型的文件会被阻塞。(例如开打一个终端设备可能需转载 2017-09-12 15:09:22 · 190 阅读 · 0 评论 -
《UNIX环境高级编程》笔记74--特殊输入字符
POSIX.1定义了11个在输入是做特殊处理的字符。实现定义了另外一些特殊字符。下表摘要列出了这些特殊字符。POSIX.1允许禁用这些字符。若将c_cc数组中的某项设置为_POSIX_VDISABLE的值,则禁用相应的特殊字符。可以使用tcsetattr函数进行操作。使用函数tcgetattr和tcsetattr可以获得或设置termios结构。转载 2017-09-19 18:35:46 · 205 阅读 · 0 评论 -
《UNIX环境高级编程》笔记66--管道
1.pipe管道是UNIX系统IPC的最古老形式,并且所有的UNIX系统都提供此种通信机制。管道有下列两种局限性:a.历史上,它们是半双工的,现在某些系统提供全双工管道,但是为了最佳的可移植性,我们决不应预先假定系统使用此特性。b.它们只能在具有公共祖先的进程之间使用。通常一个管道由一个进程创建,然后该进程调用fork,此后父子进程之间可以使用该管道。(FIFO没有第二种局限性,UNIX域套接字和...转载 2018-04-18 10:38:58 · 161 阅读 · 0 评论 -
《UNIX环境高级编程》笔记65--存储映射IO
存储映射IO使一个磁盘文件与存储空间中的一个缓冲区相映射。于是当从缓冲区中取数据,就相当于读文件中的相应的字节;将数据存入缓冲区,则相应字节就自动写入文件,这样就可以在不是用read和write的情况下执行IO。这可以通过mmap函数实现。[cpp] view plain copy#include<sys/mman.h> void *mmap(void *addr, size_t l...转载 2018-04-18 10:38:52 · 140 阅读 · 0 评论 -
《UNIX环境高级编程》笔记64--readv和writev函数
readv和write函数用于在一次函数调用中读,写多个非连续缓冲区。[cpp] view plain copy#include<sys/uio.h> ssize_t readv(int filedes, const struct iovec *iov, int iovcnt); ssize_t writev(int filedes, const struct iovec *iov...转载 2018-04-18 10:38:46 · 181 阅读 · 0 评论 -
《UNIX环境高级编程》笔记63--IO多路转换
如何才能read多个描述符呢,有下面这些方法。a.使用多个进程,每个进程执行阻塞read,但是这也产生了问题,操作什么时候停止?如果子进程接收到文件结束符,那么子进程终止,然后父进程接收到SIGCHLD信号,但是,若父进程终止,那么父进程应该通知子进程停止,为此可以使用一个信号(例如SIGUSR1),但这是程序变得更加复杂。b.使用多线程,这避免了终止的复杂性,但是要求处理线程之间的同步同样是程序...转载 2018-04-18 10:38:39 · 153 阅读 · 0 评论 -
《UNIX环境高级编程》笔记62--STREAMS
STREAMS(流)是system V提供的构造内核设备驱动程序和网络协议包的一种通用方法。流在用户进程和设备驱动程序之前提供了一条全双工通路。流无需和实际硬件设备直接会话,流也可以用来构造伪设备驱动程序,下图是一个简单流的基本构造。在流首之下可以压入处理模块,这个可以用ioctl命令实现,下图表示包含一个处理模块的流。各方框之间用两根带箭头的线连接,以突出流的全双工特性,并强调两个方向的处理是相...转载 2018-04-18 10:38:33 · 241 阅读 · 0 评论 -
《UNIX环境高级编程》笔记61--记录锁
记录锁的功能是:当一个进程正在读或者修改文件的某一个部分时,它可以阻止其他进程修改同一文件区。记录锁其实是字节范围锁,因为它锁定的只是文件中的一个区域,也可能是整个文件。1.fcntl记录锁SVR3通过fcntl函数增加了记录锁功能。fcntl函数的原型已经在以前给出,这边再重复一次。[cpp] view plain copy#include<fcntl.h> int fcntl(i...转载 2018-04-18 10:38:23 · 145 阅读 · 0 评论 -
《UNIX环境高级编程》笔记59--出错记录
与守护进程有关的一个问题是如何处理出错消息。因为它没有控制终端,所以不能只是简单地写到标准出错上,我们希望有一个集中的守护进程出错记录设施。自4.2BSD以来,BSD syslog设施得到了广泛应用。大多数守护进程使用这一设施。下图显示了syslog设置的详细组织结构;有三种方法产生日志消息:1.内核例程可以调用log函数。任何一个进程通过打开然后读/dev/klog设备就可以读取这些消息。2.大...转载 2018-04-17 10:16:12 · 192 阅读 · 0 评论 -
《UNIX环境高级编程》笔记58--守护进程
1.守护进程编程规则守护进程也被称为精灵进程(daemon),是生存期较长的一种进程。常常在系统启动时启动,仅在系统关闭时才终止,因为它没有控制终端,所以说他它们是在后台运行的。编写守护进程程序时需要遵循一些基本规则,以便防止产生并不需要的交互作用,下面先说明这些规则:1.调用umask将文件模式创建屏蔽字设置为0。因为由继承的来的文件模式创建屏蔽字可能会拒绝设置某些权限。2.调用fork,然后使...转载 2018-04-17 10:16:07 · 129 阅读 · 0 评论 -
《UNIX环境高级编程》笔记57-线程和信号
每个线程都有自己的信号屏蔽字,但是信号的处理是进程中所有线程共享的。这意味着尽管单个线程可以阻止某些信号,但当线程修改了与某个信号相关的处理行为以后,所有的线程都必须共享这个处理行为的改变。这样如果一个线程选择忽略某个信号,而其他的线程可以恢复信号的默认处理行为,或者为信号设置一个新的处理程序,从而可以撤销上述线程的信号选择。进程中的信号是递送到单个线程的。如果信号与硬件故障或计时器超时相关,该信...转载 2018-04-17 10:16:02 · 129 阅读 · 0 评论 -
《UNIX环境高级编程》笔记56--线程和fork
版权声明:本文为博主原创文章,未经博主允许不得转载。我们先来看一个程序:[cpp] view plain copy#include <pthread.h> #include <stdio.h> pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; void* th_fn(void* arg) { p...转载 2018-04-17 10:15:55 · 157 阅读 · 0 评论 -
《UNIX环境高级编程》笔记42--信号及其处理函数signal
1.信号概念信号是软件中断,很多比较重要的应用程序都需要处理信号。信号提供了一种处理异步事件的方法。在有文件<signal.h>中,这些信号被定义为正整数。不存在信号为0的信号。很多条件可以产生信号:1.当用户按某些终端键时,引发终端产生的信号。在终端上按ctrl+c键,通常产生中断信号(SIGINT)。2.硬件异常产生信号:除数为0,无效的内存引用等等。这些条件由硬件检测到,并将其通...转载 2018-04-15 20:14:35 · 258 阅读 · 0 评论 -
《UNIX环境高级编程》笔记41--孤儿进程组
POSIX.1将孤儿进程组定义为:该组中每个成员的父进程要么是该组的一个成员,要么不是该组所属会话的成员。一个进程组不是孤儿进程组的条件是:该组中有一个进程,其父进程在属于同一会话中的另一个组中。下面对孤儿进程组的产生进行检验:1.在一个具有作业控制的shell中,执行一个程序,该程序fork了一个子进程,其进程结构如下:2.父进程休眠5秒钟,这是一种让子进程在父进程终止前运行的一种权宜之计。3....转载 2018-04-15 20:14:27 · 156 阅读 · 0 评论 -
《UNIX环境高级编程》笔记40--作业控制
作业控制允许在一个终端上启动多个作业(进程组),它控制哪一个作业可以访问该终端,以及哪些作业在后台运行,作业控制要求下面三种形式的支持:1.支持作业控制的shell。2.内核中的终端驱动程序必须支持作业控制。3.内核必须提供对某些作业控制信号的支持。我们可以键入一些特殊字符来影响前台作业:1.中断字符(ctrl+c)产生SIGINT。2.退出字符(ctrl+\)产生SIGQUIT。3.挂起字符(c...转载 2018-04-15 20:14:17 · 168 阅读 · 0 评论 -
《UNIX环境高级编程》笔记20--定位流
有三种方法可以定位流。1.ftell函数和fseek函数这两个函数自V7依赖就存在了。但是它们假定文件的位置可以存放在一个长整型中。函数声明如下:[cpp] view plain copy<pre name="code" class="cpp">#include <stdio.h> long ftell(FILE* fp); //如果成功返回当前文件位置指示,出错则返回-...转载 2018-04-09 17:11:43 · 140 阅读 · 0 评论 -
《UNIX环境高级编程》笔记13--chown,fchown和lchown函数
这三个函数都是用来更改文件的用户ID和组ID的,函数的定义如下:[cpp] view plain copy#include int chown(const char *pathname, uid_t owner, gid_t group); int fchown(int filedes, uid_t owner, gid_t group转载 2017-09-06 11:18:05 · 331 阅读 · 0 评论 -
《UNIX环境高级编程》笔记12--chmod函数和fchmod函数
这2个函数都是用来改变现有文件的访问权限的。函数的定义如下:[cpp] view plain copy#include int chmod(const char* pathname, mode_t mode); //通过文件名对指定的文件进行操作 int fchmod(int filedes, mode_t mode); //通过转载 2017-09-06 11:15:50 · 331 阅读 · 0 评论