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形式。
创建管道:
创建一个管道连接到另一个进程,然后读其输出或向其输入端发送数据:
有名管道:(不常用)
mkfifo ();
内核中的IPC(消息队列、信号量、共享内存)结构都用一个非负整数的标识符加以引用。
标识符是IPC对象的内部名,为了使多个合作进程能够在同一IPC对象上会合,需要一个外部名,因此使用了"键",每个IPC对象都与一个键相关联。
键的基本系统数据类型是: key_t
创建键值:
>> IPC进程间通信详解: http://blog.csdn.net/sinat_36184075/article/details/54565377
消息队列:
信号量集:
共享内存:
最快的IPC通信方式,通常信号量被用来实现对共享存储访问的同步。
套接字,也是一种描述符,可以实现跨主机的进程间通信,即网络通信。
>> 网络编程详解: http://blog.csdn.net/sinat_36184075/article/details/54565387
创建套接字:
字节序:
linux系统 - Inter处理器 - 小端字节序;
Mac OS X - PowerPC - 大端字节序。
TCP/IP协议栈采用大端字节序。
TCP/IP应用程序,提供了4个通用函数以在处理器字节序和网络字节序之间转换:
地址格式:
ip地址转换:
查询给定计算机的主机信息:
获得网络名字和网络号:
将协议名字和协议号采用以下函数映射:
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 ();
函数库:
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 (); // 创建套接字描述符,关闭套接字close
shutdown (); // 禁止套接字上的输入和输出
字节序:
linux系统 - Inter处理器 - 小端字节序;
Mac OS X - PowerPC - 大端字节序。
TCP/IP协议栈采用大端字节序。
TCP/IP应用程序,提供了4个通用函数以在处理器字节序和网络字节序之间转换:
htonl (); // 主机→网络字节序,long
htons (); // 主机→网络字节序,short
ntohl (); // 网络→主机字节序,long
ntohs (); // 网络→主机字节序,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
第三阶段任务完成...