随笔分类 - Tcp/Ip 学习札记
以UNIX® Network Programming为教程,代码亦来自本教程。
摘要:Posix共享内存区涉及两个步骤:1、指定一个名字参数调用shm_open,以创建一个新的共享内存区对象或打开一个以存在的共享内存区对象。2、调用mmap把这个共享内存区映射到调用进程的地址空间。传递给shm_open的名字参数随后由希望共享该内存区的任何其他进程使用。相关函数: 1 shm_open()函数 2 功能: 打开或创建一个共享内存区 3 头文件: #include <sys/mman.h> 4 函数原形: int shm_open(const char *name,int oflag,mode_t mode); 5 返回值: 成功返回0,出错返回-1 6 ...
阅读全文
摘要:共享内存区是最快的可用IPC形式。它允许多个不相关的进程去访问同一部分逻辑内存。如果需要在两个运行中的进程之间传输数据,共享内存将是一种效率极高的解决方案。一旦这样的内存区映射到共享它的进程的地址空间,这些进程间数据的传输就不再涉及内核。这样就可以减少系统调用时间,提高程序效率 共享内存是由IPC为一个进程创建的一个特殊的地址范围,它将出现在进程的地址空间中。其他进程可以把同一段共享内存段“连接到”它们自己的地址空间里去。所有进程都可以访问共享内存中的地址。如果一个进程向这段共享内存写了数据,所做的改动会立刻被有访问同一段共享内存的其他进程看到。 要注意的是共享内存本身没有提供任何同步...
阅读全文
摘要:信号灯用来实现同步——用于多线程,多进程之间同步共享资源(临界资源)。信号灯分两种,一种是有名信号灯,一种是基于内存的信号灯。有名信号灯,是根据外部名字标识,通常指代文件系统中的某个文件。而基于内存的信号灯,它主要是把信号灯放入内存的,基于内存的信号灯,同步多线程时,可以放到该多线程所属进程空间里;如果是同步多进程,那就需要把信号灯放入到共享内存中(方便多个进程访问)。 有名信号灯和基于内存的信号灯,具体区别体现在创建和销毁两个函数。有名信号灯使用sem_open和sem_close函数。基于内存的信号灯使用sem_init和sem_destroy函数。sem_init的参数可以控制是同...
阅读全文
摘要:Posix消息队列的属性使用如下结构存放:struct mq_attr { long mq_flags; /*阻塞标志位,0为非阻塞(O_NONBLOCK)*/ long mq_maxmsg; /*队列所允许的最大消息条数*/ long mq_msgsize; /*每条消息的最大字节数*/ long mq_curmsgs; /*队列当前的消息条数*/ }; 队列可以在创建时由mq_open()函数的第四个参数指定mq_maxmsg,mq_msgsize。 如创建时没有指定则使用默认值,一旦创建,则不可再改变。队列可以在创建后由mq_setattr()函数设置...
阅读全文
摘要:创建消息队列的程序: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <mqueue.h> //头文件 4 #include <sys/types.h> 5 #include <sys/stat.h> 6 #include <unistd.h> 7 #include <fcntl.h> 8 #include <errno.h> 9 10 #define MQ_NAME ("/tmp") 11 #define MQ_FLA
阅读全文
摘要:消息队列可以认为是一个链表。进程(线程)可以往里写消息,也可以从里面取出消息。一个进程可以往某个消息队列里写消息,然后终止,另一个进程随时可以从消息队列里取走这些消息。这里也说明了,消息队列具有随内核的持续性,也就是系统不重启,消息队列永久存在。创建(并打开)、关闭、删除一个消息队列 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <mqueue.h> //头文件 4 #include <sys/types.h> 5 #include <sys/stat.h> 6 #incl
阅读全文
摘要:互斥锁机制(Mutual exclusion,缩写为Mutex)是一种用于多线程编程中,防止两条线程同时对同一公共资源(比如全局变量)进行读写的机制。该目的通过将代码切片成一个一个的临界区域(critical section)达成。临界区域指的是一块对公共资源进行存取的代码,并非一种机制或是算法初始化:在Linux下, 线程的互斥量数据类型是pthread_mutex_t. 在使用前, 要对它进行初始化:对于静态分配的互斥量, 可以把它设置为PTHREAD_MUTEX_INITIALIZER, 或者调用pthread_mutex_init.对于动态分配的互斥量, 在申请内存(malloc)之后
阅读全文
摘要:共享文件:UNIX系统支持在不同进程间共享打开的文件。在介绍dup()函数前,先介绍共享文件。1.每个进程在进程表中都有一个记录项,每个记录项中有一张打开文件描述符表,可将视为一个矢量,每个描述符占用一项。与每个文件描述符相关联的是: (a) 文件描述符标志。 (b) 指向一个文件表项的指针。2.内核为所有打开文件维持一张文件表。每个文件表项包含: (a) 文件状态标志(读、写、增写、同步、非阻塞等)。 (b) 当前文件位移量。 (c) 指向该文件v节点表项的指针。3.每个打开文件(或设备)都有一个 v节点结构。v节点包含了文件类型和对此文件进行各种操作的函数的指针信息。对...
阅读全文
摘要:启动我们的客户/服务器程序对,然后kill掉服务器子进程。看看客户端发生了什么?服务器端查看结果:zhaoxj$ netstat -antdp(并非所有进程都能被检测到,所有非本用户的进程信息将不会显示,如果想看到所有信息,则必须切换到 root 用户)激活Internet连接 (服务器和已建立连接的)Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program nametcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN - tc...
阅读全文
摘要:我们不愿意留存僵尸进程,因为它们占用内核空间,最终导致我们耗尽进城资源。为防止子进程变为僵尸进程,fork生成的子进程都必须被wait。#include "unp.h"intmain(int argc, char **argv){ int listenfd, connfd; pid_t childpid; socklen_t clilen; struct sockaddr_in cliaddr, servaddr; void si...
阅读全文
摘要:启动服务器端程序zhaoxj$ make tcpserv01gcc -I../lib -g -O2 -D_REENTRANT -Wall -c -o tcpserv01.o tcpserv01.cgcc -I../lib -g -O2 -D_REENTRANT -Wall -o tcpserv01 tcpserv01.o ../libunp.a -lpthreadzhaoxj$ ./tcpserv01 &[1] 13424zhaoxj$ netstat -antp(并非所有进程都能被检测到,所有非本用户的进程信息将不会显示,如果想看到所有信息,则必须切换到 root 用户)激活Inte
阅读全文
摘要:main 函数:#include "unp.h"int main(int argc, char **argv){ int sockfd; struct sockaddr_in servaddr; if (argc != 2) err_quit("usage: tcpcli <IPaddress>"); /*Socket函数原型int socket (int family, int type, int protocol);protocol为0时 ,以选择给定family和type组合的系统缺省值...
阅读全文
摘要:一个简单的回射服务器的步骤:1.客户端从标准输入读入一行文本,并写给服务器。2.服务器端从网络输入读入这行文本,并返回给客户3.客户端从网络输入读入这行反射文本,并显示在标准输出上。如图:服务器端的反射程序:#include "unp.h"int main(int argc, char **argv){ int listenfd, connfd; pid_t childpid; socklen_t clilen; /*sockaddr_in为ipv4 套接口地址结构 详解参照3.2节...
阅读全文
摘要:1.下载(UNIX® Network Programming Volume 1)源码2.阅读README提醒:很多初学者跟我一样静不下心来读E文的README。可README对我们搭建程序环境至关重要,一定要克服这种心里障碍。根据readme提示 进行下列操作1. ./configure # try to figure out all implementation differences # 会在根目录生成相应的 Makefile,Make.defines,config.h 等重要文件2. cd lib # build the basic library that all progr
阅读全文
浙公网安备 33010602011771号