摘要: 套接字描述符套接字是通信端点的抽象,套接字描述符在unix系统中都是用文件描述符实现的。许多处理文件描述符的函数都可以处理套接字描述符。int socket(int domain, int type, int protocol)创建一个套接字domain表示通信的特性,包括地址格式type确定套接字的类型,进一步确定通信特征protocol一般是0,但是当同一域和套接字类型支持多个协议时,可以使用该参数使用一个特定协议int shutdown(int sockfd, int how)套接字是双向的, 可以采用该函数来关闭套接字上的输入或者输出how:SHUT_RD SHUT_WR SHUT_R 阅读全文
posted @ 2012-09-24 18:46 w0w0 阅读(326) 评论(0) 推荐(0) 编辑
摘要: 生存期较长的一种进程,在启动时自举,在系统关闭时才终止。父进程id为0的通常是内核进程,进程1通常是init,内核自举时启动的用户层命令编写规则1)调用umask将文件创建屏蔽字设置为0。由继承而来的屏蔽字可能会拒绝设置某些权限。2)调用fork,然后使父进程退出,继承父进程的进程组id,但是会有一个新的id,这样保证这个进程不会作为进程组的组长进程。3)调用setsid以创建一个新会话4)将当前工作目录更改为根目录5)关闭不需要的文件描述符6)某些守护进程打开/dev/null使其具有文件描述符0,1,2,,这样任何的读写都不会有效果。出错记录的处理1)内核例程可以调用log函数,用户只要打 阅读全文
posted @ 2012-09-21 12:21 w0w0 阅读(277) 评论(0) 推荐(0) 编辑
摘要: 进程所有的信息对该进程所有的线程都是共享的,包括可执行的程序文本、程序的全局内存和堆内存、栈以及文件描述符int pthread_equal(pthread_t tid1, pthread_t tid2)对两个线程ID进行比较pthread_t pthread_self(void)返回本线程的id当线程需要识别以线程id作为表示的数据结构时,两个函数可以一起使用。比如可以将工作任务放在一个队列中,用线程id来控制每个工作线程处理哪些作业。线程创建int pthread_create(pthread_t *tidp, 指向的内存单元被设置为新的创建的线程的id const pthread_at. 阅读全文
posted @ 2012-09-20 12:46 w0w0 阅读(214) 评论(0) 推荐(0) 编辑
摘要: 进程标识符每个进程都有一个非负整数表示其唯一的idid=0的进程,调度进程,也叫交换进程,不执行磁盘上的程序,系统进程,内核的一部分。id=1为init进程,自举过程结束后由内核调用,读与系统有关的初始化文件。getpid() 进程idgetppid() 父进程idgetuid() 实际用户idgeteuid() 有效用户idgetgid() 组idgetegid() 有效组idfork函数fork()创建一个新的进程,子进程中返回0,父进程中返回子进程id 出错返回-1被调用一次但是返回两次子进程是父进程的副本,获得父进程的数据空间,堆和栈的副本,仅仅是副本但是不共享。父子进程共享正文段。由 阅读全文
posted @ 2012-09-19 13:13 w0w0 阅读(235) 评论(0) 推荐(0) 编辑
摘要: 进程终止正常终止方式1)从main返回2)调用exit3)调用_exit和_Exit4)最后一个线程从其启动例程返回5)最后一个线程调用pthread_exit异常终止6)调用abort7)接到一个信号并终止8)最后一个线程对取消请求作出响应登记终止处理程序int atexit(void (*func)(void));调用func时无需向他传递任何函数,也不期望他返回一个值exit退出程序时会调用登记的函数终止程序每登记一次就会被调用一次,调用顺序和登记顺序相反。同一函数若登记多次就会被调用多次。#include"apue.h"void my_exit(void){ pri 阅读全文
posted @ 2012-09-18 11:16 w0w0 阅读(196) 评论(0) 推荐(0) 编辑
摘要: 无分类和子网地址扩展(CIDR)把ip地址分为两部分的主要原因在于路由器中所需路由表的大小。路由器不必为每个目的主机维护一个路由表项,而是为每个网络保留一个路由表项。使网络数量最小解决网络地址不足的方法。代理ARP代理ARP、混杂ARP和ARP窃用,都是指的把一个网络前缀用于两个物理网络时用到的技术。这一技术,只适用于那些使用ARP将互联网地址绑定到物理地址的网络。子网编址允许一个网络地址涵盖多个物理网络,成为子网编址、子网转发或者划分子网一个网点可以选择与众不同的方式分配和使用ip地址,只要保证1.网点上所有主机和路由器都一致认同该网点的编制方案2.因特网上其他的网点可以将地址处理为一个网络 阅读全文
posted @ 2012-09-15 22:19 w0w0 阅读(332) 评论(0) 推荐(0) 编辑
摘要: 地址解析协议ARP主机知道某个目的主机的IP就可以知道该目的主机的物理地址。改进ARP每个ARP广播分组中都包含有发送方自身的IP和物理地址的绑定,接收方在处理ARP分组时,先在自己的缓存中更新发送方IP到物理地址的绑定信息。ARP是一个隐藏底层网络物理编址并且允许给每台机器分配任意IP地址的底层协议,我们把ARP看做是物理网络系统的一部分,而不是互联网的一部分。ARP缓存自动重新确认提早重新确认,将每个表项和两个计时器关联起来:传统计时器和重新确认计时器,防止传输期间的计时器失效而引起的抖动。RARP逆地址解析允许在启动时获得一个IP地址,需要网络中的另一台计算机必须被设置为监听RARP请求 阅读全文
posted @ 2012-09-15 22:16 w0w0 阅读(398) 评论(0) 推荐(0) 编辑
摘要: 标准io库处理了很多细节,比如缓冲区的分配,以优化执行io在之前的文件io中,所有的操作都是围绕文件描述符展开的,而对于标准io库,他们的操作则是围绕着流展开的,当用一个标准io库打开或者创建一个文件时,我们已经使一个流与一个文件相关联。缓冲提供缓冲的目的是尽可能减少使用read和write的调用次数。1.全缓冲:填满缓冲区后才进行实际io操作2.行缓冲:当输入或者输出遇到换行符时执行io操作3.不带缓冲:使出错信息可以尽快显示出来一般的来说,出错信息是不带缓冲的,涉及到终端设备的其他流,是行缓冲的,其他情况下都是全缓冲的。对于任何一个流,在打开该流的情况下,可以对流的类型进行改变,setbu 阅读全文
posted @ 2012-09-14 18:40 w0w0 阅读(248) 评论(0) 推荐(0) 编辑
摘要: state fstate lstate函数#include<sys/stat.h>int stat(const char* restrict pathname, stuct state *restrict buf);返回与此命名文件有关的int fstat(int fieldes, struct state *buf);返回描述符上打开文件的信息int lstat(const char *restrict pathname, struct state *restrict buf);和state类似,但是当文件时个符号链接时,返回该符号链接的有关信息struct stat是一个结构体 阅读全文
posted @ 2012-09-14 15:48 w0w0 阅读(278) 评论(0) 推荐(0) 编辑
摘要: 不带缓冲的io,绝大多数文件io都只需要用到5个函数open read write lseek close文件描述符是一个非负整数,当打开或者创建一个文件时,内核向进程返回一个文件描述符,使用open或者create返回的文件描述符标识该文件。按照惯例,标识0,1,2和标准输入输出和标准错误相关联。open函数#include<fcntl.h>open(char* pathname, int oflag, [mode_t mode]);O_RDONLY O_WRONLY O_RDWR 三种读写方式必选一种可选的比较重要的标识O_APPEND 每次读写都追加到文件的O_CREAT 若 阅读全文
posted @ 2012-09-14 13:54 w0w0 阅读(194) 评论(0) 推荐(0) 编辑
摘要: 虚基类因为虚基类引起共享子对象,共享发生之前他们就应该存在才会有意义。所以子对象的初始化顺序遵循如下的规则递归的进行:1)所有虚基类子对象,按照他们出现的位置,从上到下从左到右初始化。2)然后非虚基类按照通常顺序初始化3)所有的成员对象按照声明的顺序初始化4)完整的对象构造函数执行。#include<iostream>#include<string>using namespace std;class M{ public: M(const string &s){ cout<<"M constructure "<<s< 阅读全文
posted @ 2012-09-13 16:20 w0w0 阅读(179) 评论(0) 推荐(0) 编辑
摘要: 插入符与提取符自己定义的插入符和提取符, 就可以重载相关运算符以完成相关的操作。1.第一个参数定义成流(输入为istream,输出为ostream)的非const引用。2.执行向流中插入/提取的操作,通过处理对象的组成元素3.返回流的引用输入输出流应该是非常量,通过返回流,可以将这些流操作连接成单一语句。#include<iostream>using namespace std;class date{ public: int year; int month; int day; date(int n_year, int n_month, int n_day) ... 阅读全文
posted @ 2012-09-12 19:08 w0w0 阅读(235) 评论(0) 推荐(0) 编辑
摘要: c++ stringstring隐藏了他所包含的字符序列的物理表示。也包含了关于其数据容量及存储地址的内务处理信息。c++标准没有定义string内存布局的确切实现。只是规定无论是否采取引用计数,其语言必须保持一致。c语言中每个char数组都占据各自独立的存储区域,但是在c++中独立的几个string对象可以占据也可以不占据各自特定的物理存储区,但是如果采用引用计数避免保存同一个对象的副本,那么各个对象必须看起来像独立拥有各自的存储区一样。字符串操作replace改写字符有很多重载的版本, 最简单的用了三个参数,第一个用于指示字符串的什么位置开始改写, 第二个用于指示从源字符串中删除多少个字符 阅读全文
posted @ 2012-09-12 12:58 w0w0 阅读(236) 评论(0) 推荐(0) 编辑
摘要: c语言中常用的异常处理方式:1.在函数中返回错误信息,耦合度极高2.使用标准库中的信号处理系统,signal()能够与推断事件发生时出现了什么情况,和函数raise产生一个事件来实现。耦合度也很高,可能和其他信号冲突3.非局部跳转函数setjmp,可以在程序中保存一个已知的无错误状态,一旦发生错误就可以使用 longjmp 返回到该状态中。#include<iostream>#include<csetjmp>using namespace std;class rainbow{ public:rainbow(){ cout<<"rainbow()&q 阅读全文
posted @ 2012-09-12 10:19 w0w0 阅读(284) 评论(0) 推荐(0) 编辑
摘要: 定制new和deleteSTL的内存不由new和delete管理,是由allocator管理条款49:了解new-handler的行为当new不能满足分配空间的要求时,会抛出异常,在这之前会先调用一个客户指定的错误处理函数,一个所谓的new-handler。为了指定这个用以处理内存不足的函数,客户必须调用set_new_handler使用举例:#include<iostream>using namespace std;namespace std{ typedef void (*new_handler)(); new_handler set_new_handler(new_handl 阅读全文
posted @ 2012-09-11 10:55 w0w0 阅读(165) 评论(0) 推荐(0) 编辑