
unix编程
文章平均质量分 63
aisxyz
这个作者很懒,什么都没留下…
展开
-
打开伪终端设备
在[url=http://aisxyz.iteye.com/admin/blogs/2423960]伪终端概述[/url]一节中已对 PTY进行了初步的介绍。尽管 PTY 表现得就像物理终端设备一样,不过在打开 PTY 设备文件时,应用程序并不需要设置 O_TTY_INIT 标识(见[url=http://aisxyz.iteye.com/admin/blogs/2370533]不带缓冲的...原创 2018-07-09 20:50:01 · 356 阅读 · 0 评论 -
守护进程编写规则与出错记录
在编写守护进程程序时需要遵循以下一些基本规则,以防产生不必要的交互作用: (1)应先调用 umask 将文件模式创建屏蔽字设置为一个已知值(通常是 0),因为由继承得来的文件模式屏蔽字可能会被设置为拒绝某些权限。而另一方面,如果守护进程调用的库函数创建了文件,那么将文件模式创建屏蔽字设置为一个限制性更强的值(如 007)可能更明智,因为库函数可能不允许调用者通过一个显示的函数参数...原创 2017-12-26 01:53:09 · 267 阅读 · 0 评论 -
线程和 fork
父进程调用 fork 创建的子进程会继承整个地址空间的副本,以及每个互斥量、读写锁和条件变量的状态。如果父进程包含一个以上的线程,子进程在 fork 返回后,如果不是紧接着调用 exec 的话,就需要清理锁状态。因为在子进程内部,只存在父进程中调用 fork 的线程的副本一个线程。如果父进程中的线程占有锁,子进程将同样占有这些锁。问题是子进程可能并不包含占有锁的线程的副本,所以它就没法知道...原创 2017-12-17 22:10:48 · 193 阅读 · 0 评论 -
线程和信号
每个线程都有自己的信号屏蔽字,但是信号的处理是进程中的所有线程共享的。这意味着单个线程可以阻止某些信号,但当某个线程修改了与某个给定信号相关的处理行为以后,所有的线程都必须共享这个处理行为的改变。这样,如果一个线程选择忽略某个给定信号,那么另一个线程就可以通过以下两种方式撤销上述线程的信号选择:恢复信号的默认处理行为,或者为信号设置一个新的信号处理程序。 进程中的信号是递送到单个...原创 2017-12-15 00:18:18 · 198 阅读 · 0 评论 -
线程特定数据
线程特定数据也称线程私有数据,是存储和查询某个特定线程相关数据的一种机制。在分配线程特定数据之前,需要创建与该数据相关联的键,以用于获取对线程特定数据的访问。使用函数 pthread_key_create 可创建一个键,而对所有的线程,都可以通过 pthread_key_delete 来取消键与线程特定数据值之间的关联关系。[code="c"]#include int pthr...原创 2017-12-11 22:34:33 · 296 阅读 · 0 评论 -
线程重入
线程在遇到重入问题时与信号处理程序是类似的,在这两种情况下,多个控制线程在相同的时间有可能调用相同的函数。如果一个函数在相同的时间点可以被多个线程安全地调用,就称该函数是线程安全的。在 Single UNIX Specification 定义的函数中,下面这些是[color=red]不能[/color]保证线程安全的(另外,ctermid 和 tmpnam 传入空指针参数时也不能保证线程安...原创 2017-12-06 00:05:55 · 295 阅读 · 0 评论 -
线程同步属性
线程的同步对象和线程一样也具有属性,上一节介绍了线程属性,本节将讨论线程的同步属性,包括互斥量属性、读写锁属性、条件变量属性和屏障属性。 对比线程属性,互斥量属性也有一组操作函数。[code="c"]#include int pthread_mutexattr_init(pthread_mutexattr_t *attr);int pthread_mutexatt...原创 2017-11-22 23:00:26 · 297 阅读 · 0 评论 -
线程属性
在[url=http://aisxyz.iteye.com/admin/blogs/2396529]线程基础函数[/url]一节中我们曾提到在调用 pthread_create 函数时可以指定线程属性,还可以用 pthread_detach 函数来分离线程,以让操作系统在线程退出时收回它所占用的资源。现在就是深入讨论这个话题的时候。 可以使用 pthread_attr_t 结构修...原创 2017-11-18 12:21:07 · 130 阅读 · 0 评论 -
条件变量、自旋锁和屏障
条件变量本身是由互斥量保护的,线程在改变条件状态之前必须首先锁住互斥量。 下面一组函数可用来操作条件变量。[code="c"]#include int pthread_cond_init( pthread_cond_t *restrict cond, const pthread_condattr_t *restrict ...原创 2017-11-14 21:35:23 · 465 阅读 · 0 评论 -
互斥量与读写锁操作函数
互斥变量是用 pthread_mutex_t 数据类型表示的。下面几个函数可操作互斥量。[code="c"]#include int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);int...原创 2017-11-05 10:55:50 · 268 阅读 · 0 评论 -
线程基础函数
如同进程有一个进程 ID,每个线程也有一个线程 ID。不过进程 ID 在整个系统中是唯一的,而线程 ID 只有在它所属的进程上下文中才有意义。线程 ID 使用数据类型 pthread_t 来表示,因为这种类型在不同的实现中可能不同(有的为整型,有的为结构),所以为了移植性提供了一个比较函数 pthread_equal。另外,还提供了 pthread_self 函数来获取自身的线程 ID。...原创 2017-10-23 21:44:33 · 113 阅读 · 0 评论 -
作业控制信号
POSIX.1 认为有以下 6 个与作业控制有关的信号。 * SIGCHLD:子进程已停止或终止。 * SIGCONT:如果进程已停止,则使其继续运行,否则忽略。 * SIGSTOP:停止信号(不能被捕捉或忽略)。 * SIGTSTP:交互式停止信号。 * SIGTTIN:后台进程组成员读控制终端。 * SIGTTOU:后台进程组...原创 2017-10-13 21:08:04 · 407 阅读 · 0 评论 -
休眠函数与信号映射函数
下面 3 个函数可以使进程休眠指定的时间(会有所延迟)。[code="c"]#include unsigned int sleep(unsigned int second); /* 返回值:0 或未休眠完的秒数 */#include int nanosleep(const struct timespec *reqtp, struct timespec *remt...原创 2017-10-12 00:28:18 · 143 阅读 · 0 评论 -
sigsuspend 函数和 abort 函数
pause 函数可以阻塞进程以等待一个信号的发生,但如果该信号是阻塞的,那么该信号的传递就会被推迟直到解除阻塞。对应用程序而言,就好像该信号发生在解除阻塞和 pause 之间(取决于内核如何实现信号)。如果发生了这种情况,或者如果在解除阻塞时刻和 pause 之间确实发生了信号,那么就会产生问题,因为可能不会再见到该信号,这就使得 puase 永远阻塞。因此需要在一个原子操作中先恢复信号屏...原创 2017-10-09 21:45:02 · 249 阅读 · 0 评论 -
sigsetjmp 和 siglongjmp 函数
在[url=http://aisxyz.iteye.com/admin/blogs/2391169]非局部跳转函数 setjmp 和 longjmp 介绍[/url]一节中曾提到用于在普通函数中进行非局部转移的 setjmp 和 longjmp 函数,POSIX.1 没有指定指定这两个函数对信号屏蔽字的作用,而是定义了两个新函数 sigsetjmp 和 siglongjmp。在信号处理程序...原创 2017-10-06 21:50:54 · 445 阅读 · 0 评论 -
sigaction 和 sigqueue 函数
sigaction 函数的功能是检查或修改与指定信号相关联的处理动作。[code="c"]#include int sigaction(int signo,const struct sigaction *restrict act,struct sigaction *restrict oact); /* 返回...原创 2017-10-06 19:02:22 · 286 阅读 · 0 评论 -
信号基础函数
signal 函数可为特定的信号指定信号处理函数,可以是常量 SIG_IGN(表示忽略,但 SIGKILL 和 SIGSTOP 信号不能忽略)、SIG_DFL(表示使用默认处理动作,多数为终止)或自定义的信号处理函数地址。[code="c"]#include void (*signal(int signo, void (*func)(int)))(int); ...原创 2017-10-06 10:12:33 · 494 阅读 · 0 评论 -
信号默认处理动作及可重入函数
下表列出了每种信号的默认处理动作(有些实现支持更多信号),以及支持此信号的系统。其中,SUS 列中的“*”表示此种信号定义为基本 POSIX.1 规范部分,“XSI”表示该信号定义为 XSI 扩展部分。而系统默认动作列中的“终止+core”表示在进程当前工作目录的 core 文件中复制了该进程的内存映像(大多数 UNIX 系统调试程序都使用 core 文件检查进程终止时的状态)。[im...原创 2017-09-29 09:02:53 · 487 阅读 · 0 评论 -
fcntl 记录锁
记录锁的功能是:当有进程正在读或修改文件的某个部分时,用以阻止其他进程修改同一文件区。下表列出了各种系统提供的不同形式的记录锁。[img]http://dl2.iteye.com/upload/attachment/0128/3567/82cfe7ba-34be-387c-91be-3a6f2f68b6bb.png[/img] 本文只介绍 POSIX.1 标准的 fcntl ...原创 2018-01-06 23:48:32 · 171 阅读 · 0 评论 -
守护进程惯例
UNIX 系统中,守护进程遵循下列通用惯例。 (1)若守护进程使用锁文件,则该文件通常存储在 /var/run 目录中。不过守护进程可能需要具有超级用户权限才能在此目录下创建文件。锁文件的名字通常是 name.pid,其中,name 是该守护进程或服务的名字。例如,cron 守护进程锁文件的名字是 /var/run/crond.pid。 (2)若守护进程支持配置选项,则...原创 2018-01-06 23:52:26 · 200 阅读 · 0 评论 -
伪终端概述
伪终端就是指,一个应用程序看上去像一个终端,但事实上它并不是个真正的终端。下图显示了使用伪终端时相关进程的典型安排。[img]http://dl2.iteye.com/upload/attachment/0129/9523/81165c3d-0144-3e08-bb9d-dc8a16b4ccc9.png[/img] 图中的关键点如下。 1、通常,一个进程打开伪终端主...原创 2018-06-02 11:05:19 · 1288 阅读 · 0 评论 -
终端窗口大小和 termcap
多数 UNIX 系统都提供了一种跟踪当前终端窗口大小的方法。在窗口大小发生变化时,内核就会通知前台进程组。内核为每个终端和伪终端都维护了一个如下的 winsize 结构。[code="c"]struct winsize{ unsigned short ws_row; // rows, in characters unsigned short ws_...原创 2018-05-29 22:39:52 · 1055 阅读 · 0 评论 -
终端规范模式和非规范模式
终端规范模式很简单:发一个读请求,当一行已经输入后,终端驱动程序立即返回。以下几个条件都会造成读返回。 1、所请求的字节数已读到时。此时无需读一个完整的行,如果读了部分行,也不会丢失任何信息,下一次读会从前一次读的停止处开始。 2、当读到一个行定界符时。在[url=http://aisxyz.iteye.com/admin/blogs/2422413]终端特殊输入字符[...原创 2018-05-29 00:25:22 · 1541 阅读 · 0 评论 -
终端标识
尽管控制终端的名字在多数 UNIX 系统上都是 /dev/tty,不过为了可移植性,POSIX.1 还是提供了一个可用来确定控制终端名字的运行时函数 ctermid。[code="c"]#include char *ctermid(char *ptr); /* 返回值:若成功,返回指向终端名的指针;否则,返回指向空字符串的指针 */[/code]...原创 2018-05-23 11:18:57 · 1477 阅读 · 0 评论 -
波特率和行控制函数
虽然大多数终端设备对输入和输出都使用同一波特率(即“位/秒”),但只要硬件允许,就可以使用下面 4 个函数将它们设置为不同的值。[code="c"]#include speed_t cfgetispeed(const struct termios *termptr);speed_t cfgetospeed(const struct termios *termptr); ...原创 2018-05-22 07:53:20 · 429 阅读 · 0 评论 -
终端属性和选项标志
tcgetattr 和 tcsetattr 函数可以分别获取和设置 termios 结构,这样就可以检测和修改各种终端选项标志和特殊字符。[code="c"]#include int tcgetattr(int fd, struct termios *termptr);int tcsetattr(int fd, int opt, const struct termios *...原创 2018-05-20 07:40:56 · 689 阅读 · 0 评论 -
终端特殊输入字符
终端支持下表所示的特殊输入字符。[img]http://dl2.iteye.com/upload/attachment/0129/7813/8d8e24f5-a84a-3c1e-836c-911bc74a8b9b.png[/img][img]http://dl2.iteye.com/upload/attachment/0129/7815/fa5e28a3-1c44-3ffc-b05...原创 2018-05-17 06:33:29 · 1151 阅读 · 0 评论 -
终端 I/O 综述
终端设备可认为是由内核中的终端驱动程序控制的。每个终端设备都有一个输入队列和输出队列。如下图所示。[img]http://dl2.iteye.com/upload/attachment/0129/7795/19e52b16-e753-3d06-bec0-6e0595a59047.png[/img] 对该图要说明以下几点: 1)如果打开了回显功能,则在输入队列和输出队...原创 2018-05-10 07:56:14 · 213 阅读 · 0 评论 -
POSIX 信号量
在[url=http://aisxyz.iteye.com/admin/blogs/2418777]XSI IPC通信之信号量[/url]一节中提到了 XSI 标准的信号量。POSIX 信号量意在解决 XSI 信号量的以下几个缺陷。 1)POSIX 信号量考虑到了更高性能的实现。 2)POSIX 信号量接口使用更简单:没有信号量集。 3)POSIX 信号量在删...原创 2018-05-09 00:03:21 · 261 阅读 · 0 评论 -
XSI IPC 通信之共享存储
在[url=http://aisxyz.iteye.com/admin/blogs/2418648]XSI IPC通信之消息队列[/url]和[url=http://aisxyz.iteye.com/admin/blogs/2418777]XSI IPC通信之信号量[/url]两节中,我们讨论了消息队列和信号量,这一节将继续讨论同属于 XSI IPC 的存储共享。 共享存储允许多...原创 2018-04-25 07:18:40 · 316 阅读 · 0 评论 -
XSI IPC通信之信号量
在[url=http://aisxyz.iteye.com/admin/blogs/2418648]XSI IPC通信之消息队列[/url]一节中我们介绍了消息队列,对比消息队列,本文将介绍信号量的一些常用操作。 信号量与管道、FIFO以及消息队列等IPC机制不同,它是一个用于为多进程提供对共享数据对象的访问的计数器。为了获得共享资源,进程需要执行下列操作。 (1)测试...原创 2018-04-17 23:38:57 · 301 阅读 · 0 评论 -
XSI IPC通信之消息队列
消息队列是消息的链接表,存储在内核中,由消息队列标识符(或称为队列ID)标识。 下表列出了影响消息队列的系统限制。其中“导出的”表示这种限制来源于其他限制。比如 Linux 系统中的最大消息数是根据最大队列数和队列中所允许的最大数据量来决定的,最大队列数又受 RAM 数量多少的影响,队列的最大字节数限制进一步限制了队列中将要存储的消息的最大长度。[img]http://dl2...原创 2018-04-15 10:54:28 · 189 阅读 · 0 评论 -
XSI IPC 相似特征介绍
有 3 种称作 XSI IPC 的 IPC:消息队列、信号量以及共享存储器,本节先介绍它们相类似的特征,后面再分别说明它们各自的特殊功能(XSI IPC 没有使用文件系统命名空间,而是构造了它们自己的命名空间,为此也受到了一些批评)。 (一)标识符和键 这三种 IPC 结构在内核中都用一个非负整数的标识符加以引用。例如,要向一个消息队列发送消息或者从其中取消息,只需要知...原创 2018-02-08 23:48:49 · 193 阅读 · 0 评论 -
IPC 通信之 FIFO
FIFO 也被称为命名管道,未命名的管道只能在两个相关的进程之间使用,而且这两个相关的进程还要有一个共同的创建了它们的祖先进程。而通过 FIFO,即使不相关的进程也能交换数据。 FIFO 是一种文件类型,通过 stat 结构的 st_mode 成员可以知道文件是否是 FIFO 类型,可以用 S_ISFIFO 宏对此进行测试。创建 FIFO 类似于创建文件,它的路径名也的确存在与文...原创 2018-02-06 22:55:51 · 284 阅读 · 0 评论 -
IPC 通信之管道
管道是 UNIX 系统 IPC 的最古老但也是最常用的形式,其有以下两种局限性。 (1)历史上,管道是半双工的(即数据只能在一个方向上流动),不过现在有些系统也提供全双工管道。但为了移植性,不应预先假定系统支持全双工管道。 (2)管道只能在具有公共祖先的两个进程之间使用。通常,一个管道由一个进程创建,在进程调用 fork 之后,该管道就能在父进程和子进程之间使用了。...原创 2018-01-30 22:22:36 · 146 阅读 · 0 评论 -
readv/writev 函数及存储映射 I/O
readv 和 writev 函数可用于在一次函数调用中读、写多个非连续缓冲区,有时也称这两个函数为散布读(scatter read)和聚集写(gather write)。[code="c"]#include ssize_t readv(int fd, const struct iovec *iov, int iovcnt);ssize_t writev(int fd, c...原创 2018-01-19 00:57:02 · 418 阅读 · 0 评论 -
POSIX 异步 I/O
POSIX 异步 I/O 接口为对不同类型的文件进行异步 I/O 提供了一套一致的方法。这些接口使用 AIO 控制块来描述 I/O 操作。aiocb 结构定义了 AIO 控制块,该结构至少包括下面这些字段:[code="c"]#include struct aiocb{ int aio_fildes; // file descript...原创 2018-01-16 21:33:15 · 456 阅读 · 0 评论 -
作业控制与孤儿进程组
作业控制允许在一个终端上启动多个作业(进程组),它控制哪一个作业可以访问该终端以及哪些作业在后台运行。一个作业只是几个几个进程的集合,通常是一个进程管道。当启动一个后台作业时,shell 会赋予它一个作业标识符,并打印一个或多个进程 ID。如下。[code="bash"]$ make all > Make.out &[1] 1475 # 作业...原创 2017-09-28 01:21:58 · 183 阅读 · 0 评论 -
进程组、会话和控制终端
每个进程除了有一个进程 ID 外,还属于一个进程组。进程组是进程的集合,它们通常是在同一作业中结合起来的,其中的各进程接收来自同一终端的各种信号。每个进程组有一个进程组 ID,并可存放在 pid_t 数据类型中。 函数 getpgrp 返回调用进程的进程组 ID,函数 getpgid 可返回特定进程的进程组 ID。[code="c"]#include pid_t ge...原创 2017-09-20 07:24:01 · 685 阅读 · 1 评论 -
进程时间
任一进程都可使用 times 函数来获得它自己以及终止子进程的 3 个时间:墙上时钟时间、用户 CPU 时间和系统 CPU 时间。[code="c"]#include clock_t times(struct tms *buf); /* 返回值:若成功,返回流逝的墙上时钟时间(以时钟滴答数为单位);否则,返回 -1 */struct tms{ cloc...原创 2017-09-18 23:47:33 · 282 阅读 · 0 评论