APUE
勇敢地追
这个作者很懒,什么都没留下…
展开
-
14(高级IO)
高级IO包括非阻塞IO、记录锁、系统V流机制、IO多路转接(select和poll)、readv和writev以及存储映射IO(nmap)1 非阻塞IO非阻塞IO使我们可以调用open,read和write这样的操作,并使这些操作不会永远阻塞。如果这些操作不能完成,则立即出错返回。 对于一个指定的描述符有两种方法对其指定非阻塞IO (1)如果调用open获得描述符,则可指定O_NONBLOCK转载 2016-04-25 10:43:18 · 394 阅读 · 0 评论 -
12(线程控制)
1 线程属性int pthread_attr_init(pthread_attr_t *attr); //初始化线程属性int pthread_attr_destroy(pthread_attr_t *attr); //释放线程属性空间线程属性主要有: (1)线程的分离状态属性detachstate, (2)线程栈末尾的警戒缓冲区大小guardsize, (3)线程栈的最低地址statc原创 2016-04-23 10:55:03 · 362 阅读 · 0 评论 -
11(线程)
典型的Unix进程可以看成只有一个控制线程:一个进程同一时刻只做一件事。有了多个线程以后,每个进程就可以做不止一件事,每个线程处理各自独立的任务。这种方法有很多好处。1通过对每种事件类型分配单独的线程,能够简化处理异步事件的代码2多个进程必须使用操作系统提供的复杂机制才能实现内存和文件描述符的共享3有些问题可以通过分解从而改善整个程序的吞吐量4交互的程序同样可以使用多线程实现响应时间的改善,多转载 2016-04-23 09:38:52 · 319 阅读 · 0 评论 -
10(信号)
1 signal函数#include <signal.h>void (*signal(int signo, void (*func)(int)))(int); Returns: previous disposition of signal (see following) if OK, SIG_ERR on errorfunc的值可以是: (1)SIG_IGN–忽略 (2)SI原创 2016-04-22 18:10:00 · 2081 阅读 · 0 评论 -
8(进程控制)
本章需要熟练掌握如下几个函数fork,exec族,_exit,wait,waitpid1 进程标识符#include <unistd.h>pid_t getpid(void); Returns: process ID of calling processpid_t getppid(void); Returns: parent process ID of calli原创 2016-04-22 11:44:04 · 959 阅读 · 0 评论 -
7(进程环境)
1 进程终止共有8种方式 其中5种是正常终止1:从 main 返回2:调用 exit3:调用 _exit 或 _Exit4:最后一个线程从其启动例程返回5:最后一个线程调用 pthread_exit3种是异常终止6:调用 abort7:接到一个信号并终止8:最后一个线程对取消请求做出响应2 exit函数有三个函数用于正常终止一个程序:_exit和_Exit立即进入内核,exit则先执行原创 2016-04-22 10:16:05 · 279 阅读 · 0 评论 -
5(标准IO)
1 缓冲标准I/O库提供缓冲的目的是尽可能地减少使用read和write调用的次数。他也对每个I/O流自动地进行缓冲管理,从而避免了应用程序需要考虑这一点所带来的麻烦。不幸的是,标准I/O库最令人迷惑的也是他的缓冲。 标准I/O提供了三种类型的缓冲: 1、全缓冲。这种情况下,在填满标准I/O缓冲区后才进行实际I/O操作。对于驻留在磁盘上的文件通常是由标准I/O库实施全缓冲。一个流上执行第一次I/原创 2016-04-21 16:56:13 · 372 阅读 · 0 评论 -
4(文件和目录)
1 查看文件类型#include <sys/stat.h>int stat(const char *pathname, struct stat *buf);int fstat(int filedes, struct stat *buf);int lstat(const char * pathname, struct stat *buf); All three retur原创 2016-04-21 13:58:44 · 635 阅读 · 0 评论 -
3(文件IO,不带缓冲的IO)
1 open函数#include <fcntl.h>int open(const char *pathname, int oflag, /*mode_t mode*/ );成功则返回文件描述符,失败则返回-1 第三个参数写成/*mode_t mode */ 表示这个参数仅在创建新文件时使用 Pathname表示要打开或者创建文件的名字 Oflag可用来说明此函数的多个选项。用下面一个或多个原创 2016-04-21 09:54:46 · 406 阅读 · 0 评论 -
Makefile文件的编写
什么是makefile?一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。 makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程转载 2016-04-25 16:07:20 · 329 阅读 · 0 评论 -
1(UNIX基础)
1.2 Unix体系结构 操作系统可定义为一种软件,它控制计算机硬件资源,又称之为内核(kernel)。 内核的接口被称为系统调用(system call)。公用函数库在系统调用之上,应用软件既可以使用公用函数库,也可以使用系统调用。(系统调用和库函数的比较在最后)1.4 列出一个目录中所有文件的名字,也就是命令ls的实现Figure 1.3. List all the files in a d原创 2016-04-21 09:36:08 · 1049 阅读 · 0 评论 -
17章(高级进程间通信)
本章介绍了两种高级IPC:基于STREAMS的管道以及UNIX域套接字。1 基于STREAMS的管道因为STREAMS管道是全双工的,数据可以双向流动。所以 我们可以用fattach函数给STREAMS管道一个文件系统的名字#include <stropts.h>int fattach(int filedes, const char *path); Returns: 0 i转载 2016-04-25 14:58:41 · 334 阅读 · 0 评论 -
18(终端IO)和19(伪终端)
终端IO有两种不同的工作模式: (1)规范模式输入处理。终端输入以行为单位进行处理 (2)非规范模式输入处理。输入字符不组成行1 获得和设置终端属性使用函数tcgetattr和tcsetattr可以获得或设置termios结构。这样也可以检测和修改各种终端选择标志和特殊字符,以使终端按照我们所希望的方式进行操作#include <termios.h>int tcgetattr(int file原创 2016-04-25 15:46:23 · 540 阅读 · 0 评论 -
20(数据库函数库)
1 常用函数#include "apue_db.h"//打开数据库DBHANDLE db_open(const char *pathname, int oflag, ... /* int mode */); Returns: database handle if OK, NULL on error//关闭数据库void db_close(DBHANDLE db);//当向数据库原创 2016-04-25 16:03:09 · 328 阅读 · 0 评论 -
16(套接字)
1 套接字描述符套接字描述符在Unix系统中是用文件描述符实现的。事实上,许多处理文件描述符函数(read和write)都可以处理文件描述符 要创建一个套接字,可以调用socket函数#include <sys/socket.h>int socket(int domain, int type, int protocol); Returns: file (socket) descr原创 2016-04-25 14:53:01 · 335 阅读 · 0 评论 -
15(进程间通信)
本章讨论经典的IPC:管道、FIFO、消息队列、信号量以及共享存储器1 管道管道是Unix系统IPC最古老的方式。管道有下列两种局限性: (1) 历史上,它们是半双工的(即数据只能在一个方向上流动)。 (2) 它们只能在具有公共祖先的进程之间使用。通常,一个管道由一个进程创建,然后该进程调用fork,此后父子进程就可以应用该管道#include <unistd.h>int pipe(int f原创 2016-04-25 12:23:21 · 3590 阅读 · 0 评论 -
13(守护进程)
13.2 守护进程的特征守护进程是一种纯粹的后台进程,与运行前环境完全隔离,包括未关闭的文件描述符、控制终端、会话、进程组、工作目录以及文件创建掩码等 很多守护进程是父进程 fork 产生,所以会继承所有的父进程地址空间中的环境,所以必须在守护进程诞生之初,断绝这些相关环境,当然,守护进程也可以在 linux 系统启动时从启动脚本 /etc/rc.d 中启动,也可以由 crontab 启动 事实原创 2016-04-23 11:13:45 · 329 阅读 · 0 评论