《Unix环境高级编程》第二版

来源:互联网 发布:java多线程基础 编辑:程序博客网 时间:2024/05/12 10:13
2017.05.28 ~ 2017.05.30
(立志成为终身学习者的第一个端午节3天假期用于复习+学习Unix高级编程)
全书总共21章,分为三个阶段,因有一定的基础,故只对核心知识点做笔记,主要是系统调用函数相关,便于后续对于unix函数的快速查找和使用,再届时根据实际需求针对性验证、使用到实际项目中。
第一阶段:Unix基础、Unix标准、文件I/O、文件和目录、标准I/O库、系统数据文件和信息
第二阶段:进程环境、进程控制、进程关系、信号、线程、线程控制、守护进程、高级I/O
第三阶段:进程间通信、网络IPC:套接字、数据库函数库(暂略去部分较深入的章节)

ps:选择第二版是因为该版pdf较清晰,以后有时间再快速浏览最新版第三版的内容差异。

【进程间通信】


Unix系统IPC类型:管道、FIFO、消息队列、信号量、共享存储、套接字、STREAMS
半双工管道仍然是最常用的IPC形式。

创建管道:
#include <unistd.h>int pipe(int pipefd[2]);参数:@pipefd[0] 为读而打开;pipefd[1]为写而打开// pipefd[1]的输出时pipefd[0]的输入。

创建一个管道连接到另一个进程,然后读其输出或向其输入端发送数据:
#include <stdio.h>FILE *popen(const char *command, const char *type);int pclose(FILE *stream);// 操作方法:创建一个管道,调用fork产生一个子进程,关闭管道的不使用端,执行一个shell以运行命令,然后等待命令终止。

有名管道:(不常用)
mkfifo ();

内核中的IPC(消息队列、信号量、共享内存)结构都用一个非负整数的标识符加以引用。
标识符是IPC对象的内部名,为了使多个合作进程能够在同一IPC对象上会合,需要一个外部名,因此使用了"键",每个IPC对象都与一个键相关联。

键的基本系统数据类型是:key_t

创建键值:
#include <sys/types.h>#include <sys/ipc.h>key_t ftok(const char *pathname, int proj_id);

>> IPC进程间通信详解:http://blog.csdn.net/sinat_36184075/article/details/54565377

消息队列:
msgget ();  // 创建一个消息队列msgctl ();  // 消息控制操作msgsnd ();  // 将数据放到消息队列中msgrcv ();  // 从队列中取出消息

信号量集:
semget ();  // 创建一个信号量集semctl ();  // 信号量集控制操作semop ();  // 对信号量集的操作

共享内存:
最快的IPC通信方式,通常信号量被用来实现对共享存储访问的同步。
shmget ();  // 分配一块共享内存区域shmctl ();  // 共享内存控制操作shmat ();  // 将共享内存映射到虚拟地址空间shmdt ();  // 接触shmat的映射

【网络IPC:套接字】


套接字,也是一种描述符,可以实现跨主机的进程间通信,即网络通信。

>> 网络编程详解:http://blog.csdn.net/sinat_36184075/article/details/54565387

创建套接字:
socket (); // 创建套接字描述符,关闭套接字closeshutdown (); // 禁止套接字上的输入和输出

字节序:
linux系统 - Inter处理器 - 小端字节序;
Mac OS X - PowerPC - 大端字节序。

TCP/IP协议栈采用大端字节序。
TCP/IP应用程序,提供了4个通用函数以在处理器字节序和网络字节序之间转换:
htonl ();  // 主机→网络字节序,longhtons ();  // 主机→网络字节序,shortntohl ();  // 网络→主机字节序,longntohs ();  // 网络→主机字节序,short

地址格式:
struct sockaddr;struct sockaddr_in;struct in_addr;

ip地址转换:
inet_ntop (); // 二进制形式转换成十进制字符串形式inet_pton (); // 十进制字符串形式转换为二进制形式

查询给定计算机的主机信息:
gethostent ();  // 打开主机数据文件(/etc/hosts  /etc/services),返回文件的下一个条目sethostent ();  // 打开文件,如果已打开,将其回绕endhostent ();  // 关闭文件

获得网络名字和网络号:
gethostbyname (); // 通过网络名获取主机地址gethostbyaddr (); // 通过主机地址获取网络名getnetbyaddr (); // 从地址获取网络号getnetbyname (); // 从名字获取网络号getnetent ();setnetent ();endnetent ();

将协议名字和协议号采用以下函数映射:
getprotobyname ();
getprotobynumber ();
getprotoent ();
setprotoent ();
endprotoent ();

通过端口号获取服务信息:
getservbyname ();
getservbyport ();
getservent ();
setservent ();
endservent ();

将一个主机名字和服务名字映射到一个地址:
getaddrinfo ();
freeaddrinfo ();

getaddrinfo函数失败,使用函数生成错误消息:
gai_strerror ();

将地址转换成主机名或服务名:
getnameinfo ();

绑定:bind();
发现绑定到套接字的地址:getsockname ();
找到与套接字连接的地址:getpeername ();

建立连接:connect ();
监听连接:listen ();
获得连接请求并建立连接:accept ();

数据传输:
read ();
write ();
send ();
sendto ();
sendmsg ();
recv ();
recvfrom ();
recvmsg ();

套接字选项:
setsockopt ();
getsockopt ();

带外数据:
允许更高优先级的数据比普通数据优先传输。
sockatmask ();

【数据库函数库】


函数库:
db_open (); // 打开数据库文件db_close (); // 关闭数据库文件db_store (); // 向数据库加入一条新记录db_fetch (); // 从数据库中取出一条记录db_delete (); // 在数据库中删除一条记录db_rewind (); // 回滚到数据库的第一条记录db_nextrec (); // 顺序读下一条数据库记录




2017.05.30
第三阶段任务完成...
原创粉丝点击