Linux网络编程 第2版

第1章 Linux操作系统概述
Linux的内核主要由5个子系统组成:进程调度,内存管理,虚拟文件系统,网络接口和进程间通信。进程调度:SCHED_OTHER(被剥夺时如果处于用户态直接停止,如果处于用户态,需系统调用返回后才可剥夺),普通进程的时间片轮转调度策略,SCHED_FIFO实时性高、运行时间短,SCHED_RR实时性高,运行时间长的进程。
第2章 Linux编程环境
恢复删除可用u,Ctrl+r可取消一个命令,可以使用它对u命令造成的后果进程弥补(如u后再重新输入很麻烦,直接Ctrl+r)。静态库:ar -rcv libstr.a string.o,参数可为c,x,t,v,d。静态库:gcc -o test main.c -L ./ -lstr(或gcc -o test main.c libstr.a)。动态链接库有别名(soname),真名(realname)和链接名(linker name)。别名是前缀lib+库名+.so。真名加小版本号、发布版本,链接名是程序链接时使用的库名字。动态库:gcc -fPIC -shared -soname libstr -o libstr.so.1 string.c。动态库配置文件内容:cat /etc/ld.so.conf。ldconfig作用是在系统默认搜索路径,和动态链接库配置文件中所列出的目录里搜索动态链接库,将结果写到/etc/ld.so.cache中。ldconfig 目录名,作用是将指定目录中的动态链接库放入系统的缓存中。程序编译时链接动态链接库和运行时是不同的,运行时需要在系统目录下才行,可通过LD_LIBRARY_PATH指定搜索目录,或用/lib/ld-linux.so.2 --library-path 路径 程序名方式。dlopen方式有RTLD_LAZY(在函数返回前不解析变量地址)、RTLD_NOW,RTLD_GLOBAL(解析后可在其他链接库中使用),dlsym,dlerror可判断加载是否存在。使用动态库时要一个头文件dlfcn.h及编译时加libdl.so。gcc编译时指定宏如gcc test.c -o test -D MY或(-DMY)。编译选项-w表关闭告警,-W与-Wall一样,不过-W只显示编译器认为会出现错误的警告,而-Wall会显示所有,-Werror把告警将错误。Makefile时,第一个目录即make时执行的目录,如果把clean之类的命令放到第一个,则clean是默认的命令。模式匹配:main.o:%.o:%.c gcc -c @。其中%o:%c表将Target的.o扩展为.c。@,(OBJS)。Makefile前加-,表出错时不报错,继续执行。添加目录:VPATH=path1:path2:...。如OBJS=main.o OBJSDIR=objs,后面规则如下:@。Makefile递归调用,cd add && (MAKE) -C add)切到add目录下,执行add目录下的makefile,外层传递变量到子目录用前加export修饰。Makefile中的函数:wildcard:获取匹配文件名(查找当前目录下所有符合模式PATTERN的文件名,返回值是以空格分割的、当前目录下的所有符合模式的文件名列表,如(patsubst pattern,replacement, text)。循环:$(foreach VAR,LIST,TEXT)。gdb时run后加值,表传入参数。清除断点clear+行号,可一次清除同一行所有断点。显示变量类型:whatis,ptype。

第3章 文件系统简介

fdisk -l。mkfs.ext4。mount参数-o可对如嵌入式下默认根不可写的情况指定-o rewrite,rw属性。设备的主设备号表示系统存取这个设备的“内核驱动”,次设备号表在系统中的物理位置。文件描述符仅在同一进程中有效,即不同进程的文件描述符。写操作并不能保证数据成功写入磁盘,这在异步操作中经常出现,可以调用fsync()显示将输入写入设备。ls显示空洞文件和非空洞文件大小相同,du不同,因为du展现的是文件物理大小即在磁盘上实际所占的block数,作用如迅雷下载,先创建空洞文件,然后多线程写入。void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);其中protect为PROT_EXEC/PROT/READ/WRITE/NONE,flags可为MAP_FIXED/SHARED/PRIVATE/ANONYMOUS/DENYWRITE/LOCKED。int munmap(void *start, size_t length);fcntl获取和改变已打开文件性质。int ioctl(int d, int request, ...),对文件描述符发送特定的命令来控制文件描述符所代码的设备。

第4章 程序、进程和线程的概念

system()调用"/bin/sh-c command"执行特定的命令,阻塞当前进程直到command命令执行完成,执行system()时会调用fork,execve,waitpid等函数,其中任意一个调用失败,将导致system调用失败。使用fork,system时,会新创建进程(原进程也会存在),而exec新进程会代替原进程(新进程PID会与原来进程相同)。每个进程的用户地址空间都是独立的,但内核空间是每个进程共享的,所以进程之间要通信必须通过内核。mkfifo pi,echo "a" > pi,写入数据后如果不读出写命令就停住了,只有cat < pi读出后前面echo才可正常退出。所谓管道,其实是内核中的一串缓存。管道只存在于内存。fork出的进程,子进程会复制父进程的文件描述符,这样父子进程就可通过管道通信。消息队列是保存在内核中的消息链表,其生命周期随内核,如果未释放会一直存在。消息队列不适合较大的数据的传输,因为有最大长度限制,同时有总长度限制。ftok,msgget,msgsnd,msgrcv(int msqid,void msgq, size_t msgz, long msgtyp,int msgflg);其中msgflg表要从队列中获取的消息类型,内核将查找队列中具有匹配类型的第一个到达的消息,为0时则返回队列中最老的消息。msgctl。semget,semop,semctl,shmget,shmat,shmdt,shmctl。进程不可屏蔽SIGSTOP和SIGKILL,信号之间不存在相对的优先级系统也无法处理同时产生的多个同种信号。typedef void(sighandler_t)(int);sighandler_t signal(int signum,sighandler_t handler);进程退出并设置退出值pthread_exit((void*)&reval);int ret_join=NULL;pthread_join(pt,(void)&ret_join);线程创建失败时返回EAGAIN表数量达到上线,EINVAL表线程的属性非法。pthread_attr_init()。pthread_attrset/getschedpara。pthread_attr_setscope参数可为PTHREAD_SCOPE_SYSTEM(表系统级竞争资源)/PROCESS(表进程内竞争资源),设置绑定的线程(线程作用域)。设置线程分离状态pthread_attr_set/getdeatchstate(pthread_attr_t attr,int deatchstate),可为PTHREAD_CREATE_DETACHED/JOINABLE。pthread_mutex_init/lock/trylock/unlock,destroy。sem_init/destroy/wait/post/trywait。int sem_init(sem_t sem,int pshared,unsigned int value);其中pshared为0表只能在当前进程的多个线程间共享,不为0表可在进程间共享。

第5章 TCP/IP协议簇简介

物理、数据链路和网络层构成了通信子网层。IP地址格式为:类别+网络标识+主机标识。D类地址用于组播,如视频会议。IP地址的配置:ifconfig 网络编号 IP地址 netmask 子网掩码。原型:uint32_t htonl(uint32_t hostlong);所以传入有符号数无意义。

第6章 应用层网络服务程序简介

你可能感兴趣的:(Linux网络编程 第2版)