2011年11月27日

摘要: 1. 子list是拷贝,不是引用。改变得到的字符串不会改变原来的字符串2. [k+1 for k in a if type(k) == types.IntType]3. s = """abc def""" print s输出abc def注意换行和空格4. a = [1, 1, 2] a.remove(1)只会去掉第一个15. "ok abc".rfind("abc") #3 反向查找,索引还是按照正顺序的索引6. find和index都能返回索引,但是index找不到的时候抛出异常,处理方式太 阅读全文

posted @ 2011-11-27 14:14 SomethingReview 阅读(109) 评论(0) 推荐(0) 编辑

摘要: 用explicit声明构造函数,可以阻止它们被用来执行隐式类型转换,但它们仍然可以被用来进行显式类型转换。 “=”语法在新对象被定义时会调用copy构造函数,而不是调用赋值操作。 以by value传递用户自定义的类型通常是个坏主意,pass-by-reference-to-const往往是比较好的选择。 阅读全文

posted @ 2011-11-27 10:54 SomethingReview 阅读(83) 评论(0) 推荐(0) 编辑

摘要: const char *p = "hello";被指物是常量,指针自身不是常量。 char * const p = "hello";被指物不是常量,指针本身是常量。 const char * const p = "hello";被指物和指针本身都是常量。 vector<int> vec; const vector<int>::iterator iter = vec.begin(); // iter是const,不能改变。所指物*iter可以改变。 vector<int>::const_iterato 阅读全文

posted @ 2011-11-27 10:54 SomethingReview 阅读(82) 评论(0) 推荐(0) 编辑

摘要: #define ABC 1.234 ABC也许从未被编译器看见,也许在编译器处理源码之前就被预处理器移走,ABC有可能没有进去记号表(symbol table)内。 #define不仅不能用来定义class专属常量,也不能提供任何封装性。 当在编译期间需要一个class常量值,例如确定数组的大小,可以使用enum。 对一个const取地址是合法的,但是对enum和#define取地址是不合法的。 enum和#define一样不会导致非必要的内存分配。 对于形似函数的宏,最好改用inline函数替换#define,可以获得宏带来的效率以及一般函数的所有可预料行为和类型安全性。 阅读全文

posted @ 2011-11-27 10:54 SomethingReview 阅读(81) 评论(0) 推荐(0) 编辑

摘要: C++由四个次语言中组成,C、Object-Oriented C++、Template C++和STL。从某一个次语言切换到另一个,高效编程守则可能要改变,对内置类型而言,pass-by-value通常比pass-by-reference高效,但当你从C part of C++移往Object-Oriented C++,由于用户自定义构造函数和析构函数的存在,pass-by-reference-to-const往往更好,运用Template C++时尤其如此。然而一旦跨入STL,迭代器和函数对象都是在C指针上塑造的,所以对STL的迭代器和函数对象,pass-by-value守则再次适用。 阅读全文

posted @ 2011-11-27 10:54 SomethingReview 阅读(87) 评论(0) 推荐(0) 编辑

摘要: linux文件编程可以使用两种方法: linux系统调用,依赖于linux操作系统 int create(const char* filename, mode_t mode) 所有打开的文件都对应一个文件描述符(非负整数,由系统分配),范围是0 - OPEN_MAX。 int open(const char* pathname, int flags) int open(const char* pathname, int flags, mode_t mode) int close(int fd) int read(int fd, const void* buf, size_t length).. 阅读全文

posted @ 2011-11-27 10:53 SomethingReview 阅读(190) 评论(0) 推荐(0) 编辑

摘要: 多线程的好处: 线程是一种非常“节俭”的多任务操作方式。在linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来 维护它的代码段、数据段和堆栈段,这是一种“昂贵”的多任务工作方式。 线程间方便通信。对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过进程间通信的方式进行,这种方式不仅费时 ,而且很不方便。由于同一进程下的线程之间共享数据空间,一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便。 多线程使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。 改善程序结构。一个既长又复杂的进程可以考虑分为多个 阅读全文

posted @ 2011-11-27 10:53 SomethingReview 阅读(133) 评论(0) 推荐(0) 编辑

摘要: 为什么要进程通信?数据传输、资源共享、通知事件、进程控制。 IPC由一下三部分发展而来:UNIX进程间通信、基于System V进程间通信、POSIX进程间通信。 最初开发POSIX是为了提高UNIX环境下应用程序的可移植性。DEC的OpenVMS和Windows都支持POSIX。 进程通信的方式:管道和有名管道、信号、消息队列、共享内存、信号量、套接字。 管道是单向的,先进先出的,把一个进程的输出和一个进程的输入连接在一起,一个进程(写进程)在管道的尾部写入数据,另一个进程(读进程)从管道的头部读取数据。数据被一个进程读出后,将被从管道中删除。进程试图读空管道和向满的管道写数据都将阻塞。 . 阅读全文

posted @ 2011-11-27 10:53 SomethingReview 阅读(165) 评论(0) 推荐(0) 编辑

摘要: 进程是一个具有一定独立功能的程序的一次运行活动。 程序是静态的代码,进程是动态的。 进程特点:动态性(相对于程序来说)、并发性(多个进程同时执行)、独立性(进程之间互不干扰)、异步性(进程执行有先后顺序) 进程状态:就绪(进程刚被创建还没有分到CPU时间片,进程时间片用完)、阻塞(IO请求未完成)、执行(就绪态经过进程调度进入执行态) 进程ID(PID)是标识进程的唯一数字。 父进程ID(PPID) 启动进程的用户的ID(UID) 进程互斥:有若干进程都要使用某一共享资源时,任何时刻最多允许一个进程使用,其他要使用该资源的进程必须等待,直到占用该资源者释放了该资源为止。 临界资源 临界区 进. 阅读全文

posted @ 2011-11-27 10:53 SomethingReview 阅读(190) 评论(0) 推荐(0) 编辑

摘要: connect函数将激发TCP的三路握手过程,而且仅在连接建立成功或出错时才返回。CLOSED状态到SYN_SENT状态,若成功则再转移到ESTABLISHED状态。 对于bind函数,如果TCP服务器没有把IP地址捆绑到它的套接字接口,内核就把客户发送的SYN的宿IP地址作为服务器的源IP地址。如果选择指定IP地址为通配地址,那么内核将等到套接口已连接(TCP)或已在套接口上发出数据报(UDP)时才选择一个本地IP地址。 如果让内核来为套接字选择一个临时端口号,那么必须注意,bind并不返回所选的值,bind的第二个参数有const限定词,必须调用getsockname来返回协议地址。 .. 阅读全文

posted @ 2011-11-27 10:51 SomethingReview 阅读(193) 评论(0) 推荐(0) 编辑

摘要: 套接字地址结构:从进程到内核的传递,从内核到进程的传递 网际套接口地址结构 通用套接字地址结构 我们总是通过指针传递这些结构,而且将结构的大小作为另外一个参数来传递。当套接口函数填写结构时,结构长度也作为指针传递,这样它的值可以被函数更新,我们把这样的参数称为值-结果参数。 TCP套接口为应用程序提供了一个字节流,它们没有记录标记,函数read的返回值可以比我们要求的数量少,但并不表示错误。 网络协议在处理多字节整数时使用大端字节序。 阅读全文

posted @ 2011-11-27 10:51 SomethingReview 阅读(98) 评论(0) 推荐(0) 编辑

摘要: TCP提供客户和服务器的连接,跨越连接交换数据,然后终止连接。 TCP提供可靠性。TCP向另一端发送数据要求对方返回一个确认,如果确认没有收到,TCP将自动重传并等待更长的时间。数次重传失败后TCP才放弃。 TCP通过给所发送的数据的每一个字节关联一个序列号进行排序。如果发送的分节非顺序到达,接收方的TCP会根据它们的序列号重新排序,再把结果数据传递给应用进程。如果TCP接收到重复的数据,它可以判断数据是重复的,从而把它丢弃掉。 TCP提供流量控制。TCP总是告诉对方它能够接收多少字节的数据,这称为通告窗口。 TCP的连接是全双工的。因此TCP必须跟踪每个方向数据流的状态信息,如序列号和通告. 阅读全文

posted @ 2011-11-27 10:51 SomethingReview 阅读(140) 评论(0) 推荐(0) 编辑

摘要: TCP是无记录边界的字节流协议。 TCP本身不提供记录结束标记,应用程序需要确定记录边界的话,必须自己去实现。FTP和SMTP使用\r\n构成序列终止记录。Sun RPC和DNS使用TCP时,在每个记录的前面放一个二进制计数值,由它给出记录的长度。 错误处理:包裹函数 每当在一个Unix函数发生错误时,全局变量errno将被置成一个指示错误类型的正数,函数本身则通常返回-1。err_sys检查errno变量并输出其相应的出错消息。如果函数不返回错误,errno的值就没有定义。值0不表示任何错误。 把errno值存于全局变量不适合共享所有全局变量的多线程。 snprintf检查目标缓冲区是否溢. 阅读全文

posted @ 2011-11-27 10:50 SomethingReview 阅读(113) 评论(0) 推荐(0) 编辑