07 2013 档案

嵌入式LINUX环境下视频采集知识
摘要:V4L2是Linux环境下开发视频采集设备驱动程序的一套规范(API),它为驱动程序的编写提供统一的接口,并将所有的视频采集设备的驱动程序都纳入其的管理之中。V4L2不仅给驱动程序编写者带来极大的方便,同时也方便了应用程序的编写和移植,具有广泛的应用价值。 Video for Linux ... 阅读全文

posted @ 2013-07-31 17:39 疯子123 阅读(277) 评论(0) 推荐(0) 编辑

Web安全测试之XSS
摘要:XSS 全称(Cross Site Scripting) 跨站脚本攻击, 是Web程序中最常见的漏洞。指攻击者在网页中嵌入客户端脚本(例如JavaScript), 当用户浏览此网页时,脚本就会在用户的浏览器上执行,从而达到攻击者的目的. 比如获取用户的Cookie,导航到恶意网站,携带木马等。作... 阅读全文

posted @ 2013-07-31 16:39 疯子123 阅读(136) 评论(0) 推荐(0) 编辑

Fiddler (五) Mac下使用Fiddler
摘要:Fiddler是用C#开发的。 所以Fiddler不能在Mac系统中运行。 没办法直接用Fiddler来截获MAC系统中的HTTP/HTTPS, Mac 用户怎么办呢?Fiddler可以允许“远程连接”。 我们可以利用这个间接来实现Fiddler捕获Mac系统发出的HTTP/HTTPS... 阅读全文

posted @ 2013-07-31 01:00 疯子123 阅读(252) 评论(0) 推荐(0) 编辑

Fiddler (四) 实现手机的抓包
摘要:Fiddler是我最喜爱的工具,几乎每天都用, 我已经用了8年了。 至今我也只学会其中大概50%的功能。 Fiddler绝对称得上是"神器", 任何一个搞IT的人都得着的。小弟我立志, 一定要把Fiddler的所有的功能和用法都写出来。 写成一个完整系列的教程。Fiddler不但能截获各种浏览器发... 阅读全文

posted @ 2013-07-31 00:59 疯子123 阅读(98) 评论(0) 推荐(0) 编辑

Fiddler (三) Composer创建和发送HTTP Request
摘要:Fiddler的功能还有很多, 很多功能都没有被挖掘出来。这次我们介绍Fiddler中的一个非常有用的功能Composer,是用来创建和发送HTTP Request的。Composer的使用方法很简单,看下就知道用了。Fiddler Composer介绍Composer的官方帮助文档:http:/... 阅读全文

posted @ 2013-07-31 00:56 疯子123 阅读(122) 评论(0) 推荐(0) 编辑

Fiddler (二) Script 用法
摘要:现在我们来看看Fiddler的高级用法. Fiddler Script。 Fiddler中的script 可以让我们自动修改Http request和Response 的内容。 而不用手动地去下"断点"来修改http Request或Response中的值。 Fiddler的作者Fiddl... 阅读全文

posted @ 2013-07-31 00:54 疯子123 阅读(201) 评论(0) 推荐(0) 编辑

HTTP协议 (七) Cookie
摘要:Cookie是HTTP协议中非常重要的东西, 之前拜读了Fish Li 写的【细说Cookie】, 让我学到了很多东西。Fish的这篇文章写得太经典了。 所以我这篇文章就没有太多内容了。 最近我打算写一个系列的HTTP文章,我站在HTTP协议的角度, 说说我对Cookie的理解。 Cookie是什... 阅读全文

posted @ 2013-07-31 00:32 疯子123 阅读(148) 评论(0) 推荐(0) 编辑

HTTP协议 (六) 状态码详解
摘要:HTTP状态码,我都是现查现用。 我以前记得几个常用的状态码,比如200,302,304,404, 503。 一般来说我也只需要了解这些常用的状态码就可以了。 如果是做AJAX,REST,网络爬虫,机器人等程序。还是需要了解其他状态码。 本文我花了一个多月的时间把所有的状态码都总结了下,内容太... 阅读全文

posted @ 2013-07-31 00:22 疯子123 阅读(307) 评论(0) 推荐(0) 编辑

HTTP协议 (五) 代理
摘要:这次介绍代理服务器, 代理服务器是HTTP协议中一个重要的组件, 发挥着重要的作用。 本文介绍一些HTTP代理服务器的概念和工作原理。什么是代理服务器Web代理(proxy)服务器是网络的中间实体。 代理位于Web客户端和Web服务器之间,扮演“中间人”的角色。HTTP的代理服务器即是Web服务器... 阅读全文

posted @ 2013-07-31 00:18 疯子123 阅读(122) 评论(0) 推荐(0) 编辑

HTTP协议 (四) 缓存
摘要:这次继续介绍HTTP协议中的缓存机制。HTTP协议提供了非常强大的缓存机制, 了解这些缓存机制,对提高网站的性能非常有帮助。 本文介绍浏览器和Web服务器之间如何处理"浏览器缓存",以及控制缓存的http header.本文会使用Fiddler来查看HTTP request和Response。 缓... 阅读全文

posted @ 2013-07-31 00:15 疯子123 阅读(101) 评论(0) 推荐(0) 编辑

HTTP协议 (三) 压缩
摘要:这次继续介绍HTTP协议中的压缩。本文会使用Fiddler来查看HTTP request和Response。HTTP压缩是指: Web服务器和浏览器之间压缩传输的”文本内容“的方法。 HTTP采用通用的压缩算法,比如gzip来压缩HTML,Javascript, CSS文件。 能大大减少网络传输的... 阅读全文

posted @ 2013-07-31 00:13 疯子123 阅读(121) 评论(0) 推荐(0) 编辑

HTTP协议 (二) 基本认证
摘要:http协议是无状态的, 浏览器和web服务器之间可以通过cookie来身份识别。 桌面应用程序(比如新浪桌面客户端, skydrive客户端)跟Web服务器之间是如何身份识别呢?什么是HTTP基本认证桌面应用程序也通过HTTP协议跟Web服务器交互, 桌面应用程序一般不会使用cookie, 而是... 阅读全文

posted @ 2013-07-31 00:11 疯子123 阅读(147) 评论(0) 推荐(0) 编辑

HTTP协议详解
摘要:当今web程序的开发技术真是百家争鸣,ASP.NET, PHP, JSP,Perl, AJAX 等等。 无论Web技术在未来如何发展,理解Web程序之间通信的基本协议相当重要, 因为它让我们理解了Web应用程序的内部工作. 本文将对HTTP协议进行详细的实例讲解,内容较多,希望大家耐心看。也希望对... 阅读全文

posted @ 2013-07-31 00:02 疯子123 阅读(137) 评论(0) 推荐(0) 编辑

Wireshark基本介绍和学习TCP三次握手
摘要:这篇文章介绍另一个好用的抓包工具wireshark, 用来获取网络数据封包,包括http,TCP,UDP,等网络协议包。记得大学的时候就学习过TCP的三次握手协议,那时候只是知道,虽然在书上看过很多TCP和UDP的资料,但是从来没有真正见过这些数据包, 老是感觉在云上飘一样,学得不踏实。有了wir... 阅读全文

posted @ 2013-07-30 23:52 疯子123 阅读(107) 评论(0) 推荐(0) 编辑

Fiddler 教程
摘要:Fiddler是最强大最好用的Web调试工具之一,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据. 使用Fiddler无论对开发还是测试来说,都有很大的帮助。Fiddler的基本介绍Fiddler的官方网站: www.fiddler2.comFi... 阅读全文

posted @ 2013-07-30 23:48 疯子123 阅读(89) 评论(0) 推荐(0) 编辑

UNIX网络编程——线程池模式比较(ICE线程池模型和L/F领导者跟随者模式)
摘要:程池模式一般分为两种:L/F领导者与跟随者模式、HS/HA半同步/半异步模式。 HS/HA 半同步/ 半异步模式 :分为三层,同步层、队列层、异步层,又称为生产者消费者模式,主线程处理I/O事件并解析然后再往队列丢数据,然后消费者读出数据进行应用逻辑处理; 优点:简化编程将低层的异步I/O和高层同... 阅读全文

posted @ 2013-07-29 22:36 疯子123 阅读(202) 评论(0) 推荐(0) 编辑

UNIX网络编程——常用服务器模型总结
摘要:下面有9种服务器模型分别是:迭代服务器。并发服务器,为每个客户fork一个进程。预先派生子进程,每个子进程都调用accept,accept无上锁保护。预先派生子进程,以文件锁的方式保护accept。 预先派生子进程,以线程互斥锁上锁的方式保护accept。预先派生子进程,由父进程向子进程传递套接口... 阅读全文

posted @ 2013-07-29 18:52 疯子123 阅读(181) 评论(0) 推荐(0) 编辑

UNIX网络编程——客户/服务器程序设计示范(总结)
摘要:(1)当系统负载较轻是,每来一个客户请求现场派生一个子进程为之服务的传统并发服务器程序模型就足够了。这个模型甚至可以与inetd结合使用,也就是inetd处理每个连接的接收。我们的其他意见是就重负荷运行的服务器而言的,譬如Web服务器。 (2)相比传统的每个客户fork一次设计示范,预先创建一个子... 阅读全文

posted @ 2013-07-29 18:12 疯子123 阅读(128) 评论(0) 推荐(0) 编辑

UNIX网络编程——客户/服务器程序设计示范(八)
摘要:TCP预先创建线程服务器程序,主线程统一accept 最后一个使用线程的服务器程序设计示范是在程序启动阶段创建一个线程池之后只让主线程调用accept并把每个客户连接传递给池中某个可用线程。 本设计示范的问题在于主线程如何把一个已连接套接字传递... 阅读全文

posted @ 2013-07-29 17:17 疯子123 阅读(109) 评论(0) 推荐(0) 编辑

UNIX网络编程——客户/服务器程序设计示范(七)
摘要:TCP预先创建线程服务器程序,每个线程各自accept 前面讨论过预先派生一个子进程池快于为每个客户线程派生一个子进程。在支持线程的系统上,我们有理由预期在服务器启动阶段预先创建一个线程池以取代为每个客户线程创建一个线程的做法有类似的性能加速。本服务器的基本设计是预先创建一个... 阅读全文

posted @ 2013-07-29 16:46 疯子123 阅读(109) 评论(0) 推荐(0) 编辑

UNIX网络编程——客户/服务器程序设计示范(六)
摘要:TCP并发服务器程序,每个客户一个线程 前面讲述了,每个客户一个进程的服务器,或为每个客户现场fork一个子进程,或者预先派生一定数目的子进程。如果服务器主机支持线程,我们就可以改用线程以取代子进程。#include "unpthread.h"intmain(... 阅读全文

posted @ 2013-07-29 16:40 疯子123 阅读(125) 评论(0) 推荐(0) 编辑

UNIX网络编程——客户/服务器程序设计示范(五)
摘要:TCP预先派生子进程服务器程序,传递描述符 对预先派生子进程服务器程序的最后一个修改版本是只让父进程调用accept,然后把所接受的已连接套接字“传递”给某个子进程。这么做绕过了为所有子进程的accept调用提供上锁保护的可能需求,不过需要从父进程到子进程的某种... 阅读全文

posted @ 2013-07-29 16:34 疯子123 阅读(147) 评论(0) 推荐(0) 编辑

UNIX网络编程——客户/服务器程序设计示范(四)
摘要:TCP预先派生子进程服务器程序,accept使用线程上锁保护 我们使用线程上锁保护accept,因为这种方法不仅适用于同一进程内各线程之间的上锁,而且适用于不同进程之间的上锁。 为了使用线程上锁,我们的main、child_make和child_mai... 阅读全文

posted @ 2013-07-29 16:20 疯子123 阅读(137) 评论(0) 推荐(0) 编辑

UNIX网络编程——客户/服务器程序设计示范(三)
摘要:TCP预先派生子进程服务器程序,accept无上锁保护 我们的第一个“增强”型服务器程序使用称为预先派生子进程的技术。使用该技术的服务器不像传统意义的并发服务器那样为每个客户现场派生一个子进程,而是启动阶段预先派生一定数量的子进程,当各个客户连接到达时,这些子进程... 阅读全文

posted @ 2013-07-29 13:57 疯子123 阅读(120) 评论(0) 推荐(0) 编辑

UNIX网络编程——客户/服务器程序设计示范(二)
摘要:TCP并发服务器程序,每个客户一个子进程 传统上并发服务器调用fork派生一个子进程来处理每个客户。这使得服务器能够同时为多个客户服务,每个进程一个客户。客户数目的唯一限制是操作系统对以其名义运行服务器的用户ID能够同时有多个子进程的限... 阅读全文

posted @ 2013-07-29 13:38 疯子123 阅读(114) 评论(0) 推荐(0) 编辑

UNIX网络编程——客户/服务器程序设计示范(一)
摘要:下面给出的是客户程序用于测试我们的服务器程序的各个变体。#include "unp.h"#define MAXN 16384 /* max # bytes to request from server */intmain(int argc, char **argv){ int i... 阅读全文

posted @ 2013-07-29 11:45 疯子123 阅读(125) 评论(0) 推荐(0) 编辑

UNIX网络编程——使用线程的TCP回射服务器程序
摘要:同一进程内的所有线程除了共享全局变量外还共享:(1)进程指令;(2)大多数数据;(3) 打开的文件(即描述符);(4)信号处理函数和信号处置;(5)当前工作目录;(6)用户ID和组ID。不过每个线程有各自的:(1)线程ID;(2)寄存器集合,包括程序计数器和栈指针;(3)栈(用于存放局... 阅读全文

posted @ 2013-07-29 11:07 疯子123 阅读(129) 评论(0) 推荐(0) 编辑

UNIX网络编程——TCP—经受时延与nagle算法、滑动窗口、拥塞窗口
摘要:1、经受时延: TCP在接收到数据时并不立即发送ACK,相反,它推迟发送,以便将ACK与需要沿该方向发送的数据一起发送,时延为200ms,超过时延范围,发送确认。 2、nagle算法: 一个TCP连接上最多只能有一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其他的小分... 阅读全文

posted @ 2013-07-28 23:07 疯子123 阅读(157) 评论(0) 推荐(0) 编辑

UNIX网络编程——带外数据小结
摘要:TCP没有真正的带外数据,不过提供紧急模式和紧急指针。一旦发送端进入紧急模式,紧急指针就出现在发送到对端的分节中的TCP首部中。连接的对端收取该指针是在告知接收进程发送端已经进入紧急模式,而且该指针指向紧急数据的最后一个字节。然而所有数据的发送仍然受TCP正常的流量控制支配。 ... 阅读全文

posted @ 2013-07-28 22:57 疯子123 阅读(116) 评论(0) 推荐(0) 编辑

UNIX网络编程——send与recv函数详解
摘要:#include ssize_t recv(int sockfd, void *buff, size_t nbytes, int flags);ssize_t send(int sockfd, const void *buff, size_t nbytes, int flags);send和rec... 阅读全文

posted @ 2013-07-28 22:43 疯子123 阅读(182) 评论(0) 推荐(0) 编辑

UNIX网络编程——关于socket阻塞与非阻塞情况下的recv、send、read、write返回值
摘要:1、阻塞模式与非阻塞模式下recv的返回值各代表什么意思?有没有 区别?(就我目前了解阻塞与非阻塞recv返回值没有区分,都是 0接收到数据大小,特别:返回 值 0发送数据大小,特别:返回值 0表示接收到数据。 这2种模式下的返回值是不是这么理解,有没有跟详细的理解或跟准确的 说明? 4、阻塞模... 阅读全文

posted @ 2013-07-28 21:37 疯子123 阅读(200) 评论(0) 推荐(0) 编辑

UNIX网络编程——TCP服务器“拒绝服务攻击” 解决方案
摘要:前面的博客>里面的拒绝服务型攻击也有提到。 说这是一个完全的解决方案,其实有点夸大了,但这个方案确实可以缓解TCP服务器遭受“拒绝服务攻击”时表现出的脆弱性。 当服务器以TCP的方式提供服务时,客户端通过tcp连接上服务器。这时,恶意的程序,也可以通过tcp连... 阅读全文

posted @ 2013-07-28 21:25 疯子123 阅读(225) 评论(0) 推荐(0) 编辑

UNIX网络编程——客户/服务器心搏函数
摘要:阅读此博客时,可以参考以前的博客>和>。 下面是关于回送客户和服务器程序开发一些简单的心搏函数。这些函数可以发现对端主机或到对端的通信路径的过早失效。 在给出这些函数之前我们必须提出一些警告。首先,有人会想到使用TCP的保持存活特性(SO_KEEP... 阅读全文

posted @ 2013-07-28 20:31 疯子123 阅读(187) 评论(0) 推荐(0) 编辑

UNIX网络编程——TCP带外数据小结
摘要:带外数据概念实际上时向接收端传送三个不同的信息:(1)发送端进入紧急模式这个事实。接收进程得以通知这个事实的手段不外乎SIGURG信号或select调用。本通知在发送进程发送带外字节后由发送端TCP立即发送,即使往接收端的任何数据发送因流量控制而停止了,TCP仍然发送本通知。本通知可... 阅读全文

posted @ 2013-07-28 20:04 疯子123 阅读(186) 评论(0) 推荐(0) 编辑

UNIX网络编程——sockatmark函数
摘要:每当收到一个带外数据时,就有一个与之关联的带外标记。这是发送进程发送带外字节时该字节在发送端普通数据流中的位置。在从套接字读入期间,接收进程通过调用sockatmark函数确定是否处于带外标记。#include int sockatmark(int sockfd); /* 返回值:如... 阅读全文

posted @ 2013-07-28 19:36 疯子123 阅读(175) 评论(0) 推荐(0) 编辑

UNIX网络编程——带外数据
摘要:许多传输层有带外数据的概念,它有时也称为经加速数据。其想法是一个连接的某端发生了重要的事情,而且该端希望迅速通告其对端。这里“迅速”意味着这种通知应该在已排队等待发送的任何“普通”(有时称为“带内”)数据之前发送。也就是说,带外数据被认为具有比普通数据更高的优先级。带外数据并不需要在... 阅读全文

posted @ 2013-07-26 17:18 疯子123 阅读(201) 评论(0) 推荐(0) 编辑

UNIX网络编程——信号驱动式I/O
摘要:信号驱动式I/O是指进程预先告知内核,使得当某个描述符上发生某事时,内核使用信号通知相关进程。 针对一个套接字使用信号驱动式I/O,要求进程执行以下3个步骤:建立SIGIO信号的信号处理函数。设置该套接字的属主,通常使用fcntl的F_SETOWN命令设置。开启该套接字的信号驱动... 阅读全文

posted @ 2013-07-26 16:29 疯子123 阅读(311) 评论(0) 推荐(0) 编辑

UNIX网络编程——非阻塞accept
摘要:当有一个已完成的连接准备好被accept时,select将作为可读描述符返回该连接的监听套接字。因此,如果我们使用select在某个监听套接字上等待一个外来连接,那就没有必要把监听套接字设置为非阻塞,这是因为如果select告诉我们该套接字上已有连接就绪,那么随后的accept调用不... 阅读全文

posted @ 2013-07-26 16:09 疯子123 阅读(321) 评论(0) 推荐(0) 编辑

UNIX网络编程——非阻塞connect: Web客户程序
摘要:非阻塞的connect的实现例子出自Netscape的Web客户程序。客户先建立一个与某个Web服务器的HTTP连接,再获取一个主页。该主页往往含有多个对于其他网页的引用。客户可以使用非阻塞connect同时获取多个网页,以此取代每次只获取一个网页的串行获取手段。图16-12展示了一个并... 阅读全文

posted @ 2013-07-26 14:15 疯子123 阅读(199) 评论(0) 推荐(0) 编辑

UNIX网络编程——非阻塞connect:时间获取客户程序
摘要:#include "unp.h"intconnect_nonb(int sockfd, const SA *saptr, socklen_t salen, int nsec){ int flags, n, error; socklen_t len; fd_set rset, wset;... 阅读全文

posted @ 2013-07-26 13:14 疯子123 阅读(278) 评论(0) 推荐(0) 编辑

UNIX网络编程——非阻塞connect
摘要:当在一个非阻塞的TCP套接字上调用connect时,connect将立即返回一个EINPROGRESS错误,不过已经发起的TCP三次握手继续进行。我们接着使用select检测这个连接或成功或失败的已建立条件。非阻塞的connect有三个用途:我们可以把三次握手叠加在其他处理上。完成一个c... 阅读全文

posted @ 2013-07-26 13:05 疯子123 阅读(124) 评论(0) 推荐(0) 编辑

UNIX网络编程——非阻塞式I/O(套接字)
摘要:套接字的默认状态是阻塞的。这就意味着当发出一个不能立即完成的套接字调用时,其进程将被投入睡眠,等待相应的操作完成。可能阻塞的套接字调用可分为以下4类:(1)输入操作,包括read,readv,recv,recvfrom和recvmsg共5个函数。如果某个进程对一个阻塞的TCP套接字(默认... 阅读全文

posted @ 2013-07-26 12:35 疯子123 阅读(299) 评论(0) 推荐(0) 编辑

UNIX网络编程——使用select 实现套接字I/O超时
摘要:下面程序包含read_timeout、write_timeout、accept_timeout、connect_timeout 四个函数封装:/* read_timeout - 读超时检测函数,不含读操作 * fd:文件描述符 * wait_seconds:等待超时秒数, 如果为0表示不... 阅读全文

posted @ 2013-07-26 11:52 疯子123 阅读(257) 评论(0) 推荐(0) 编辑

UNIX网络编程——设置套接字超时
摘要:在涉及套接字的I/O操作上设置超时的方法有以下3种:调用alarm,它在指定超时期时产生SIGALRM信号。这个方法涉及信号处理,而信号处理在不同的实现上存在差异,而且可能干扰进程中现有的alarm调用。在select中阻塞等待I/O(select有内置的时间限制),以此代替直接阻塞在r... 阅读全文

posted @ 2013-07-26 11:28 疯子123 阅读(172) 评论(0) 推荐(0) 编辑

UNIX网络编程——名字与地址转换(gethostbyname,gethostbyaddr,getservbyname,getservbyport,getaddrinfo,getnameinfo函数)
摘要:名字和数值地址间进行转换的函数:gethostbyname和gethostbyaddr在主机名字与IPv4地址之间进行转换。getservbyname和getservbyport在服务器名字和端口号之间进行转换。还有两个协议无关的转换函数:getaddrinfo和getnameinfo,... 阅读全文

posted @ 2013-07-26 10:53 疯子123 阅读(175) 评论(0) 推荐(0) 编辑

UNIX网络编程——使用select函数的TCP和UDP回射服务器程序
摘要:服务器程序:#include #include #include #include #include #include #include #include #include #include #include #include #include #define SERV_PORT 3334#def... 阅读全文

posted @ 2013-07-25 19:16 疯子123 阅读(220) 评论(0) 推荐(0) 编辑

UNIX网络编程——UDP 中的外出接口的确定
摘要:已连接UDP套接字还可用来确定用于特定目的地的外出接口。这是由connect函数应用到UDP套接字时的一个副作用造成的:内核选择本地IP地址。这个本地IP地址通过为目的IP地址搜索路由表得到外出接口,然后选用该接口的主IP地址而选定。 注意:getsockname函数调用的位置。#... 阅读全文

posted @ 2013-07-25 18:38 疯子123 阅读(188) 评论(0) 推荐(0) 编辑

UNIX网络编程——UDP缺乏流量控制(改进版)
摘要:现在我们查看无任何流量控制的UDP对数据报传输的影响。首先我们把dg_cli函数修改为发送固定数目的数据报,并不再从标准输入读。如下,它写2000个1400字节大小的UDP数据报给服务器。客户端程序cli.c:#include #include #include #include #in... 阅读全文

posted @ 2013-07-25 18:05 疯子123 阅读(178) 评论(0) 推荐(0) 编辑

UNIX网络编程——UDP 的connect函数(改进版)
摘要:上一篇我们提到,除非套接字已连接,否则异步错误是不会返回到UDP套接字的。我们确实可以给UDP套接字调用connect,然而这样做的结果却与TCP连接大相径庭:没有三次握手。内核只是检查是否存在立即可知的错误(例如一个显然不可达的目的地),记录对端的IP地址和端口号(取自传递给conne... 阅读全文

posted @ 2013-07-25 15:53 疯子123 阅读(258) 评论(0) 推荐(0) 编辑

UNIX网络编程——UDP回射服务器程序(初级版本)以及漏洞分析
摘要:该函数提供的是一个迭代服务器,而不是像TCP服务器那样可以提供一个并发服务器。其中没有对fork的调用,因此单个服务器进程就得处理所有客户。一般来说,大多数TCP服务器是并发的,而大多数UDP服务器是迭代的。 对于本套接字,UDP层中隐含有排队发生。事实上每个UDP套接字都有一个... 阅读全文

posted @ 2013-07-25 14:53 疯子123 阅读(154) 评论(0) 推荐(0) 编辑

UNIX网络编程——基于UDP协议的网络程序
摘要:一、下图是典型的UDP客户端/服务器通讯过程 下面依照通信流程,我们来实现一个UDP回射客户/服务器: #include #include ssize_t send(int sockfd, const void... 阅读全文

posted @ 2013-07-25 14:01 疯子123 阅读(129) 评论(0) 推荐(0) 编辑

UNIX网络编程——UDP编程模型
摘要:使用UDP编写的一些常见得应用程序有:DNS(域名系统),NFS(网络文件系统)和SNMP(简单网络管理协议)。 客户不与服务器建立连接,而是只管使用sendto函数给服务器发送数据报,其中必须指定目的地(即服务器)的地址作为参数。类似的,服务器不接受来自客户的连接,而是只管调用... 阅读全文

posted @ 2013-07-25 12:16 疯子123 阅读(87) 评论(0) 推荐(0) 编辑

UNIX网络编程——SOCKET API和TCP STATE的对应关系_三次握手_四次挥手及TCP延迟确认
摘要:在socket系统调用中,如何完成三次握手和四次挥手: SOCK_DGRAM即UDP中的connect操作知识在内核中注册对方机器的IP和PORT信息,并没有建立连接的过程,即没有发包,close也不发包)。 而SOCK_STREAM对应如下: connect会完成TCP的... 阅读全文

posted @ 2013-07-25 11:32 疯子123 阅读(194) 评论(0) 推荐(0) 编辑

UNIX网络编程——通用套接字选项
摘要:1. SO_BROADCAST 套接字选项 本选项开启或禁止进程发送广播消息的能力。只有数据报套接字支持广播,并且还必须是在支持广播消息的网络上(例如以太网,令牌环网等)。我们不可能在点对点链路上进行广播,也不可能在基于连接的传输协议(例如TCP和SCTP)之上进行广播。 2. SO_DE... 阅读全文

posted @ 2013-07-25 10:54 疯子123 阅读(154) 评论(0) 推荐(0) 编辑

UNIX网络编程——产生RST
摘要:产生RST的3个条件:1. 建立连接的SYN到达某端口,但是该端口上没有正在监听的服务。 如:IP为192.168.1.33的主机上并没有开启WEB服务(端口号为0x50),这时我们通过IE去访问192.168.1.33,通过Wireshark抓包,可以看到,对此SYN包的回复为RST。说明此... 阅读全文

posted @ 2013-07-25 01:54 疯子123 阅读(149) 评论(0) 推荐(0) 编辑

UNIX网络编程——fcntl函数
摘要:fcntl函数提供了与网络编程相关的如下特性:非阻塞式I/O。 通过使用F_SETFL命令设置O_NONBLOCK文件状态标志,我们可以把一个套接字设置为非阻塞型。信号驱动式I/O。 通过使用F_SETFL命令设置O_ASYNC文件状态标志,我们可以把一个套接字设置成O_ASYNC,一旦其状态发... 阅读全文

posted @ 2013-07-25 01:47 疯子123 阅读(382) 评论(0) 推荐(0) 编辑

UNIX网络编程——内网与外网间通信
摘要:QQ是一个基于TCP/UDP协议的通讯软件 发送消息的时候是UDP打洞,登陆的时候使用HTTP~因为登陆服务器其实就是一个HTTP服务器,只不过不是常用的那些,那个服务器是腾讯自行开发的!!!一、登录 QQ客户端在局域网内,当你打开QQ登录到QQ服务器时,通过外网,你的... 阅读全文

posted @ 2013-07-25 01:02 疯子123 阅读(127) 评论(0) 推荐(0) 编辑

UNIX网络编程——TCP长连接与短连接的区别
摘要:一、TCP短连接 我们模拟一下TCP短连接的情况,client向server发起连接请求,server接到请求,然后双方建立连接。client向server发送消息,server回应client,然后一次读写就完成了,这时候双方任何一个都可以发起close操作,不过一般都是client先发... 阅读全文

posted @ 2013-07-25 00:56 疯子123 阅读(142) 评论(0) 推荐(0) 编辑

UNIX网络编程——经常使用的套接字选项
摘要:1.设置/获取套接字选项int setsockopt(int socket, int level, int option_name, const void *option_value, socklen_t option_len);int getsockopt(int socket, int lev... 阅读全文

posted @ 2013-07-24 15:53 疯子123 阅读(121) 评论(0) 推荐(0) 编辑

UNIX网络编程——心跳包
摘要:所谓的心跳包就是在客户端和服务器端间定时通知对方自己状态的一个自己定义的命令字,按照一定的时间间隔发送,类似于心跳,所以叫做心跳包。 一般是用来判断对方(设备,进程或其它网元)是否正常动行,一般采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经当掉。用于检... 阅读全文

posted @ 2013-07-24 15:44 疯子123 阅读(152) 评论(0) 推荐(0) 编辑

UNIX网络编程——套接字选项(SOL_SOCKET级别)
摘要:#include int setsockopt( int socket, int level, int option_name,const void *option_value, size_t option_len);第一个参数socket是套接字描述符。第二个参数level是被设置的选项的级别,... 阅读全文

posted @ 2013-07-24 15:39 疯子123 阅读(183) 评论(0) 推荐(0) 编辑

UNIX网络编程——套接字选项(setsockopt)
摘要:setsockopt的一些用法:close socket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket:BOOL bReuseaddr=TRUE;setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseadd... 阅读全文

posted @ 2013-07-24 15:04 疯子123 阅读(234) 评论(0) 推荐(0) 编辑

UNIX网络编程——处理服务器中大量的TIME_WAIT
摘要:出现条件:服务器主动关闭 短连接服务加剧 根据TCP协议定义的3次握手断开连接规定,发起socket主动关闭的一方 socket将进入TIME_WAIT状态,TIME_WAIT状态将持续2个MSL(Max Segment Lifetime),TIME_WAIT状态下的socke... 阅读全文

posted @ 2013-07-24 14:45 疯子123 阅读(180) 评论(0) 推荐(0) 编辑

UNIX网络编程——套接字选项(心跳检测、绑定地址复用)
摘要:/* 设置套接字选项周期性消息检测连通性 心跳包、 心博。主要用于长连接。 * 参数:套接字, 1或0开启, 首次间隔时间, 两次间隔时间, 断开次数 */void setKeepAlive( int iSockfd , int iSockAttrOn, socklen_t iIdleTime ,... 阅读全文

posted @ 2013-07-24 14:02 疯子123 阅读(239) 评论(0) 推荐(0) 编辑

UNIX网络编程——TCP 滑动窗口协议
摘要:什么是滑动窗口协议? 一图胜千言,看下面的图。简单解释下,发送和接受方都会维护一个数据帧的序列,这个序列被称作窗口。发送方的窗口大小由接受方确定,目的在于控制发送速度,以免接受方的缓存不够大,而导致溢出,同时控制流量也可以避免网络拥塞。下面图中的4,5,6号数据帧已经被发送出去,但是未收到... 阅读全文

posted @ 2013-07-24 13:59 疯子123 阅读(221) 评论(0) 推荐(0) 编辑

UNIX网络编程——套接字选项(SO_REUSEADDR)
摘要:1、一般来说,一个端口释放后会等待两分钟之后才能再被使用,SO_REUSEADDR是让端口释放后立即就可以被再次使用。 SO_REUSEADDR用于对TCP套接字处于TIME_WAIT状态下的socket,才可以重复绑定使用。server程序总是应该在调用bind()之前设置SO_REUSEAD... 阅读全文

posted @ 2013-07-24 13:55 疯子123 阅读(125) 评论(0) 推荐(0) 编辑

UNIX网络编程——套接字选项(SO_RCVBUF和SO_SNDBUF)
摘要:有时候我们需要控制套接字的行为(如修改缓冲区的大小),这个时候我们就要学习套接字选项。int getsockopt(int sockfd,int level,int optname,void *optval,socklen_t *optlen)int setsockopt(int soc... 阅读全文

posted @ 2013-07-24 12:03 疯子123 阅读(244) 评论(0) 推荐(0) 编辑

UNIX网络编程——使用select函数编写客户端和服务器
摘要:首先看原先《UNIX网络编程——并发服务器(TCP)》的代码,服务器代码serv.c:#include#include#include#include#include#include#include#include#include#include#define ERR_EXIT(m) \... 阅读全文

posted @ 2013-07-24 10:00 疯子123 阅读(225) 评论(0) 推荐(0) 编辑

UNIX网络编程——shutdown 与 close 函数 的区别
摘要:假设server和client 已经建立了连接,server调用了close, 发送FIN 段给client(其实不一定会发送FIN段,后面再说),此时server不能再通过socket发送和接收数据,此时client调用read,如果接收到FIN 段会返回0,但client此时还是可以... 阅读全文

posted @ 2013-07-24 00:56 疯子123 阅读(130) 评论(0) 推荐(0) 编辑

UNIX网络编程——ICMP报文分析:端口不可达
摘要:ICMP的一个规则是,ICMP差错报文必须包括生成该差错报文的数据报IP首部(包含任何选项),还必须至少包括跟在该IP首部后面的前8个字节(包含源端口和目的端口)。在我们的例子中,跟在IP首部后面的前8个字节包含UDP的首部。 我们利用前面博客中UNIX网络编程学习(18)中UDP回... 阅读全文

posted @ 2013-07-23 19:53 疯子123 阅读(250) 评论(0) 推荐(0) 编辑

UNIX网络编程——僵尸进程
摘要:在fork()/exec()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵尸进程,无法正常结束,此时即使是root身份kill -9也不能杀死僵尸进程。补救办法是杀... 阅读全文

posted @ 2013-07-23 19:51 疯子123 阅读(113) 评论(0) 推荐(0) 编辑

UNIX网络编程——I/O复用:select和poll函数
摘要:我们看到TCP客户同时处理两个输入:标准输入和TCP套接字。我们遇到的问题是就在客户阻塞于(标准输入上)fgets调用,服务器进程会被杀死。服务器TCP虽然正确的给客户TCP发送了一个FIN,但是既然客户进程正阻塞于从标准输入读入的过程,它将看不到这个EOF,直到从套接字读时为止(可能额... 阅读全文

posted @ 2013-07-23 18:59 疯子123 阅读(189) 评论(0) 推荐(0) 编辑

UNIX网络编程——TCP回射服务器/客户端程序
摘要:下面通过最简单的客户端/服务器程序的实例来学习socket API。 serv.c 程序的功能是从客户端读取字符然后直接回射回去:#include#include#include#include#include#include#include#... 阅读全文

posted @ 2013-07-23 08:42 疯子123 阅读(289) 评论(0) 推荐(0) 编辑

UNIX网络编程——getsockname和getpeername函数
摘要:这两个函数或者返回与某个套接字关联的本地协议地址(getsockname),或者返回与某个套接字关联的外地协议地址即得到对方的地址(getpeername)。#include int getsockname(int sockfd,struct sockaddr* localaddr,s... 阅读全文

posted @ 2013-07-22 23:56 疯子123 阅读(203) 评论(0) 推荐(0) 编辑

UNIX网络编程——并发服务器(TCP)
摘要:在迭代服务器中,服务器只能处理一个客户端的请求,如何同时服务多个客户端呢?在未讲到select/poll/epoll等高级IO之前,比较老土的办法是使用fork来实现。 网络服务器通常用fork来同时服务多个客户端,父进程专门负责监听端口,每次accept一个新的客户端连接就fo... 阅读全文

posted @ 2013-07-22 19:35 疯子123 阅读(316) 评论(0) 推荐(0) 编辑

UNIX网络编程——基本TCP套接字编程
摘要:一、基于TCP协议的网络程序下图是基于TCP协议的客户端/服务器程序的一般流程: 服务器调用socket()、bind()、listen()完成初始化后,调用accept()阻塞等待,处于... 阅读全文

posted @ 2013-07-22 14:19 疯子123 阅读(169) 评论(0) 推荐(0) 编辑

UNIX网络编程——socket概述和字节序、地址转换函数
摘要:一、什么是socketsocket可以看成是用户进程与内核网络协议栈的编程接口。socket不仅可以用于本机的进程间通信,还可以用于网络上不同主机的进程间通信。socket API是一层抽象的网络编程接口,适用于各种底层网络协议,如IPv4、IPv6,以及以后要讲的UNIX Domain Sock... 阅读全文

posted @ 2013-07-22 13:29 疯子123 阅读(312) 评论(0) 推荐(0) 编辑

UNIX网络编程——TCP输出,UDP输出
摘要:TCP输出 每一个TCP套接字有一个发送缓冲区,我们可以使用SO_SNDBUF套接字选项来更改该缓冲区的大小。当某个应用进程调用write时,内核从该应用进程的缓冲区中复制所有数据到(或是应用程序的缓冲区大于套接字的发送缓冲区,或是套接字的发送缓冲区中已有其他数据),该应用进程将被投入睡眠... 阅读全文

posted @ 2013-07-22 12:30 疯子123 阅读(190) 评论(0) 推荐(0) 编辑

UNIX网络编程——分析一帧基于UDP的TFTP协议帧
摘要:下图是UDP的段格式: 相比TCP段格式,UDP要简单得多,也没啥好说的,需要注意的是UDP数据长度指payload加上首部的长度。下面分析一帧基于UDP的TFTP协议帧:以太网首部0000: 00 05 5d 67 d0 b1 00 05 5d 61 58 a... 阅读全文

posted @ 2013-07-22 11:56 疯子123 阅读(140) 评论(0) 推荐(0) 编辑

UNIX网络编程——网络层:IP
摘要:一、IP数据报格式 IP数据报格式如下: 版本:IP协议版本号,长度为4位,IPv4此字段值为4,IPv6此字段值为6 首部长度:以32位的字为单位,该字段长度为4位,最小值为5,即不带任何选项的IP首部20个字节... 阅读全文

posted @ 2013-07-22 11:37 疯子123 阅读(120) 评论(0) 推荐(0) 编辑

UNIX网络编程——TCP连接的建立和断开、滑动窗口
摘要:一、TCP段格式: TCP的段格式如下图所示: 源端口号与目的端口号:源端口号和目的端口号,加上IP首部的源IP地址和目的IP地址唯一确定一个TCP连接。 序号:序号表示在这个报文段中的第一个数据字节序号。 ... 阅读全文

posted @ 2013-07-22 11:36 疯子123 阅读(169) 评论(0) 推荐(0) 编辑

UNIX网络编程——TCP/IP简介
摘要:一、ISO/OSI参考模型 OSI(open system interconnection)开放系统互联模型是由ISO(International Organization for Standardization)国际标准化组织定义的网络分层模型,共七层,如下图: ... 阅读全文

posted @ 2013-07-22 11:28 疯子123 阅读(144) 评论(0) 推荐(0) 编辑

UNIX网络编程——网络数据包检测
摘要:网络数据包检测数据包捕获(sniffer):是指在网络上进行数据收集的行为,需要通过网卡来完成。三种访问方式:BSD Packet Filter(BPF)SVR4 Datalink Provider Interface(DLPI)linux SOCK_PACKET interfacelibpcap... 阅读全文

posted @ 2013-07-19 15:10 疯子123 阅读(256) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——TCP/IP网络编程
摘要:常用网络信息检索函数gethostname()getpeername()getsockname()gethostbyname()gethostbyaddr()getprotobyname()getprotobynumber()getservbyname()getservbyport()网络属性设置... 阅读全文

posted @ 2013-07-19 15:02 疯子123 阅读(360) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——网络编程常用函数及结构
摘要:IP地址的转换#include int inet_aton(const char *strptr, struct in_addr *addrptr);//将strptr字符串转换成32位的网络字节序(二进制值--a.b.c.d->32)。int_addr_t... 阅读全文

posted @ 2013-07-19 14:32 疯子123 阅读(172) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——网络基础概念
摘要:TCP协议分成两个不同的协议:1、网络传输中差错的传输控制协议TCP2、专门负责对不同网络进行互联的互联网协议IP网络体系结构概念:网络体系结构即是指网络的层次结构和每层所使用协议的集合OSI:(Open System Interconnect Reference Model)ISO:国际标准化组... 阅读全文

posted @ 2013-07-19 13:09 疯子123 阅读(154) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——进程管理和通信(总结)
摘要:进程管理与通信进程的管理进程和程序的区别:进程: 程序的一次执行过程 动态过程,进程的状态属性会发生变化程序:存放在磁盘上的指令、数据的有序集合 是个文件,可直观看到程序program 静态的概念,本身不会发生变化。指令谁来执行,数据谁来访问?cpu!但前提是cpu能够接触到,程序执行过程需... 阅读全文

posted @ 2013-07-19 12:49 疯子123 阅读(224) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——线程和信号
摘要:每个线程都有自己的信号屏蔽字,但是信号的处理是进程中所有线程共享的。这意味着尽管单个线程可以阻止某些信号,但当线程修改了与某个信号相关的处理行为以后,所有的线程都必须共享这个处理行为的改变。这样如果一个信号选择忽略某个信号,而其他的线程可以恢复信号的默认处理行为,或者为信号设置一个新的处... 阅读全文

posted @ 2013-07-18 17:41 疯子123 阅读(196) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——线程和fork
摘要:当线程调用fork时,就为子进程创建了整个进程地址空间的副本。子进程通过继承整个地址空间的副本,也从父进程那里继承了所有互斥量、读写锁和条件变量的状态。如果父进程包含多个线程,子进程在fork返回以后,如果紧接着不是马上调用exec的话,就需要清理锁的状态。 在子进程内部只存在一... 阅读全文

posted @ 2013-07-18 17:01 疯子123 阅读(156) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——线程私有数据
摘要:线程私有数据(Thread-specific data,TSD):存储和查询与某个线程相关数据的一种机制。在进程内的所有线程都共享相同的地址空间,即意味着任何声明为静态或外部变量,或在进程堆声明的变量,都可以被进程内所有的线程读写。一个线程真正拥有的唯一私有存储是处理器寄存器,栈在“主人... 阅读全文

posted @ 2013-07-17 17:04 疯子123 阅读(224) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——互斥量属性
摘要:互斥量具有一些属性,通过修改这些属性可以控制锁的一些行为。缺省的互斥锁属性及其值如下:pshared: PTHREAD_PROCESS_PRIVATEtype: PTHREAD_MUTEX_DEFAULTprotocol: ... 阅读全文

posted @ 2013-07-17 16:17 疯子123 阅读(282) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——线程属性之分离属性
摘要:说到线程的分离状态,我认为,之所以会有这个状态,是因为系统对某些线程的终止状态根本不感兴趣导致的。 我们知道,进程中的线程可以调用:int pthread_join(pthread_t tid, void **rval_ptr); 来等待某个线程的终止,获得该线程的终止状... 阅读全文

posted @ 2013-07-17 16:07 疯子123 阅读(153) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——线程属性之并发度
摘要:并发度控制着用户级线程可以映射的内核线程或进程的数目。如果操作系统的实现在内核级的线程和用户级的线程之间保持一对一的映射,那么改变并发度并不会有什么效果,因为所有的用户级线程都可能被调度到。但是,如果操作系统的实现让用户级线程到内核级线程或进程之间的映射关系是多对一的话,那么在给定时间内... 阅读全文

posted @ 2013-07-17 15:48 疯子123 阅读(326) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——线程属性
摘要:pthread_attr_t 的缺省属性值 属性 值 结果 scope PTHREAD_SCOPE_PROCESS 新线程与进程中的其他线程发生竞争。 detachstate PTHREAD_CREATE_JOINABLE 线程退出后,保留完成状态和线程... 阅读全文

posted @ 2013-07-17 13:32 疯子123 阅读(264) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——线程限制
摘要: 阅读全文

posted @ 2013-07-17 13:31 疯子123 阅读(84) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——线程同步之互斥锁、读写锁和条件变量(小结)
摘要:一、使用互斥锁1、初始化互斥量pthread_mutex_t mutex =PTHREAD_MUTEX_INITIALIZER;//静态初始化互斥量int pthread_mutex_init(pthread_mutex_t*mutex,pthread_mutexattr_t*attr);//动态... 阅读全文

posted @ 2013-07-17 12:27 疯子123 阅读(341) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——线程与进程区别
摘要:进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:(1)一个程序至少有一个进程,一个进程至少有一个线程。(2)线程的划分尺度小于进程,使得多线程程序的并发性高。 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内... 阅读全文

posted @ 2013-07-17 11:57 疯子123 阅读(219) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——死锁
摘要:操作系统中有若干进程并发执行,它们不断申请、使用、释放系统资源,虽然系统的进程协调、通信机制会对它们进行控制,但也可能出现若干进程都相互等待对方释放资源才能继续运行,否则就阻塞的情况。此时,若不借助外界因素,谁也不能释放资源,谁也不能解除阻塞状态。根据这样的情况,操作系统中的死锁被定义为系统中... 阅读全文

posted @ 2013-07-17 11:53 疯子123 阅读(96) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——线程同步之条件变量以及属性
摘要:条件变量变量也是出自POSIX线程标准,另一种线程同步机制。主要用来等待某个条件的发生。可以用来同步同一进程中的各个线程。当然如果一个条件变量存放在多个进程共享的某个内存区中,那么还可以通过条件变量来进行进程间的同步。 每个条件变量总是和一个互斥量相关联,条件本身是由互斥量保护的... 阅读全文

posted @ 2013-07-16 22:59 疯子123 阅读(209) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——线程同步之读写锁以及属性
摘要:读写锁和互斥量(互斥锁)很类似,是另一种线程同步机制,但不属于POSIX标准,可以用来同步同一进程中的各个线程。当然如果一个读写锁存放在多个进程共享的某个内存区中,那么还可以用来进行进程间的同步, 互斥量要么是锁住状态要么是不加锁状态,而且一次只有一个线程可以对其加锁。读写锁可以... 阅读全文

posted @ 2013-07-16 15:16 疯子123 阅读(128) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——线程同步之互斥量
摘要:互斥量(也称为互斥锁)出自POSIX线程标准,可以用来同步同一进程中的各个线程。当然如果一个互斥量存放在多个进程共享的某个内存区中,那么还可以通过互斥量来进行进程间的同步。 互斥量,从字面上就可以知道是相互排斥的意思,它是最基本的同步工具,用于保护临界区(共享资源),以保证在任何... 阅读全文

posted @ 2013-07-16 13:59 疯子123 阅读(132) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——pthread_create的问题
摘要:linux 下常用的创建多线程函数pthread_create(pthread_t * thread , pthread_attr_t * attr , void *(*start_routine)(void*) , void *args);其中第一个参数用来保存线程信息,第二个参数指新... 阅读全文

posted @ 2013-07-16 12:22 疯子123 阅读(145) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——主线程与子线程的退出关系
摘要:我们在一个线程中经常会创建另外的新线程,如果主线程退出,会不会影响它所创建的新线程呢?下面就来讨论一下。1、 主线程等待新线程先结束退出,主线程后退出。正常执行。示例代码:#include #include #include #include #include pthread_t ntid;//... 阅读全文

posted @ 2013-07-16 11:53 疯子123 阅读(165) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——线程
摘要:线程包含了表示进程内执行环境必需的信息,其中包括进程中标示线程的线程ID、一组寄存器值、栈、调度优先级和策略、信号屏蔽字、errno变量以及线程私有数据。 进程的所有信息对该进程的所有线程都是共享的,包括可执行的程序文本、程序的全局内存和堆内存、栈以及文件描述符。线程标识: ... 阅读全文

posted @ 2013-07-15 17:39 疯子123 阅读(127) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——IPC总结
摘要:IPC主要包括:管道,消息队列,信号量,共享内存, 套接字(SOCKET)。一、IPC对象的持久性 每种IPC机制都会借助一种数据结构,这种数据结构的实例称为该IPC机制的对象(相应的,用于同步互斥的数据结构的实体也可以称为该机制的对象)。理清IPC对象的持久性,有助于理解相应的... 阅读全文

posted @ 2013-07-15 17:16 疯子123 阅读(210) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——select和epoll的区别
摘要:select和epoll都用于监听套接口描述字上是否有事件发生,实现I/O复用select(轮询)#include #include int select (int maxfdpl, fd_set* readset, fd_set* writeset, fd_set* exceptset, con... 阅读全文

posted @ 2013-07-15 15:59 疯子123 阅读(230) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——epoll函数使用详解
摘要:epoll - I/O event notification facility 在linux的网络编程中,很长的时间都在使用select来做事件触发。在linux新的内核中,有了一种替换它的机制,就是epoll。 相比于select,epoll最大的好处在于它不会随着监听... 阅读全文

posted @ 2013-07-15 15:24 疯子123 阅读(543) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——select、poll和epoll
摘要:一、select select目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点,事实上从现在看来,这也是它所剩不多的优点之一。 select的一个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024,不过可以通过修改宏定义甚至重新编译内... 阅读全文

posted @ 2013-07-15 15:08 疯子123 阅读(121) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——I/O多路转接(select、pselect和poll)
摘要:I/O多路转接:先构造一张有关描述符的列表,然后调用一个函数,直到这些描述符中的一个已准备好进行I/O时,该函数才返回。在返回时,它告诉进程哪些描述符已准备好可以进行I/O。 poll、pselect和select这三个函数使我们能够执行I/O多路转接。一、select函数在所有... 阅读全文

posted @ 2013-07-15 11:39 疯子123 阅读(187) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——非阻塞设置
摘要:非阻塞I/O使我们可以调用open、read和write这样的I/O操作,并使这些操作不会永远阻塞。如果这种操作不能完成,则调用立即出错返回,表示该操作如继续执行将阻塞。对于一个给定的描述符有两种方法对其指定非阻塞:(1)如果调用open获得描述符,则可指定O_NONBLOCK标志。(2... 阅读全文

posted @ 2013-07-15 10:56 疯子123 阅读(99) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——记录上锁(fcntl函数)以及死锁检测
摘要:一、记录锁 record locking 功能:当一个进程正在读或修改文件的某个部分时,它可以阻止其它进程修改同一文件区。 字节范围锁 byte-range locking 二、历史 flock函数,可以锁整个文件,不能锁文件中的一部分。 fcntl函数,增加了记录锁的功能。 lockf函数,在f... 阅读全文

posted @ 2013-07-10 11:37 疯子123 阅读(378) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——存储映射I/O(mmap函数)
摘要:共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据: 一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之... 阅读全文

posted @ 2013-07-09 10:02 疯子123 阅读(173) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——System V 共享内存区
摘要:共享内存区域是被多个进程共享的一部分物理内存。如果多个进程都把该内存区域映射到自己的虚拟地址空间,则这些进程就都可以直接访问该共享内存区域,从而可以通过该区域进行通信。共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其... 阅读全文

posted @ 2013-07-08 14:19 疯子123 阅读(181) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——system V消息队列
摘要:unix早期通信机制中的信号能够传送的信息量有限,管道则只能传送无格式字节流,这远远是不够的。 消息队列(也叫报文队列)客服了这些缺点: 消息队列就是一个消息的链表。 可以把消息看作一个记录,具有特定的格式。 进程可以按照一定的规则向消息队列中添加新消息;... 阅读全文

posted @ 2013-07-08 10:47 疯子123 阅读(217) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——进程间通讯方法整理
摘要:一.无名管道pipe#include int pipe(int fd [2])二.fifo#include int mkfifo(const char *path, mode_t mode);三.信号#include void (*signal(int sig, void (*func)(int)... 阅读全文

posted @ 2013-07-07 18:45 疯子123 阅读(216) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——system V信号量
摘要:1. 信号量(semaphore)主要用于保护临界资源。进程可以根据它判断是否能访问某些共享资源。信号量除了用于访问控制外,还可用于进程同步,也就是进程间通信。2. 信号量分类:a. 二值信号量: 信号量的值只能取0或1,类似于互斥锁mutex,但两者又不同:mutex 与 二值信号量的区别:信号... 阅读全文

posted @ 2013-07-07 18:20 疯子123 阅读(285) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——创建与打开IPC通道
摘要:创建或打开一个IPC对象的三个getXXX函数的第一个参数key是类型为key_t的IPC键,返回值identifier是一个整数标识符。该标识符不同于ftok函数的id参数。对于key值,应用程序有两种选择。(1)调用ftok,给它传递pathname和id。(2)指定key为IPC_PRIVA... 阅读全文

posted @ 2013-07-07 18:11 疯子123 阅读(190) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——Linux系统调用列表
摘要:以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数。这可能是你在互联网上所能看到的唯一一篇中文注释的Linux系统调用列表,即使是简单的字母序英文列表,能做到这么完全也是很罕见的。按照惯例,这个列表以man pages第2节,即系统调用节为蓝本。按照笔者的理解,... 阅读全文

posted @ 2013-07-07 18:01 疯子123 阅读(154) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——管道和FIFO限制
摘要:系统加于管道和FIFO的唯一限制为:OPEN_MAX 一个进程在任意时刻打开的最大描述符数;PIPE_BUF 可原子的写往一个管道或FIFO的最大数据量。OPEN_MAX的值可通过调用sysconf函数查询。它通过可通过执行ulimit命令(Bourne shell或Korn ... 阅读全文

posted @ 2013-07-07 17:51 疯子123 阅读(229) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——计算机体系结构基础知识
摘要:无论是在CPU外部接总线的设备还是在CPU内部接总线的设备都有各自的地址范围,都可以像访问内存一样访问,很多体系结构(比如ARM)采用这种方式操作设备,称为内存映射I/O(Memory-mappedI/O)。但是x86比较特殊,x86对于设备有独立的端口地址空间,CPU核需要引出额外的地址线来连接... 阅读全文

posted @ 2013-07-07 17:50 疯子123 阅读(154) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——管道读写规则和pipe Capacity、PIPE_BUF
摘要:一、当没有数据可读时O_NONBLOCK disable:read调用阻塞,即进程暂停执行,一直等到有数据来到为止。O_NONBLOCK enable:read调用返回-1,errno值为EAGAIN。示例程序如下:#include#include#include#include#include#... 阅读全文

posted @ 2013-07-07 16:27 疯子123 阅读(281) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——管道和FIFO的额外属性
摘要:一个描述符能以两种方式设置成非阻塞。(1)调用open时可以指定O_NONBLOCK标志。 writefd = open(FIFO1,O_WRONLY | O_NONBLOCK,0);(2)如果一个描述符已经打开,那么可以调用fcntl以启用O_NONBLOCK标志。对于管道来说,必须使用这... 阅读全文

posted @ 2013-07-07 16:12 疯子123 阅读(204) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——无名管道和有名管道
摘要:一、进程间通信每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Com... 阅读全文

posted @ 2013-07-07 15:12 疯子123 阅读(287) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——守护进程列表
摘要:amd:自动安装NFS(网络文件系统)守侯进程apmd:高级电源治理Arpwatch:记录日志并构建一个在LAN接口上看到的以太网地址和ip地址对数据库Autofs:自动安装治理进程automount,与NFS相关,依靠于NISBootparamd:引导参数服务器,为LAN上的无盘工作站提供引导所... 阅读全文

posted @ 2013-07-07 14:54 疯子123 阅读(117) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——信号说明列表
摘要:$ kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE9) SIGKILL 10) SIGUSR1... 阅读全文

posted @ 2013-07-07 14:49 疯子123 阅读(136) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——进程间通信概念
摘要:进程间通信 --- IPC1. 进程间通信的目的a. 数据传输: 一个进程需要将他的数据发送给另一个进程b. 资源共享: 多个进程之间共享同样的资源c. 通知事件: 一个进程需要向另一个或一组进程发送消息,通知它们发生了某种事件。d. 进程控制: 有些进程希望完全控制另一个进程的执行(如debug... 阅读全文

posted @ 2013-07-07 14:46 疯子123 阅读(105) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——守护进程
摘要:一、守护进程简介守护进程,也就是通常说的Daemon进程,是Linux中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程常常在系统引导装入时启动,在系统关闭时终止。Linux系统有很多守护进程,大多数服务都是通过守护进程实现的,... 阅读全文

posted @ 2013-07-07 14:43 疯子123 阅读(135) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——信号
摘要:一、信号生命周期 从信号发送到信号处理函数的执行完毕。 对于一个完整的信号生命周期(从信号发送到相应的处理函数执行完毕)来说,可以分为三个重要的阶段,这三个阶段由四个重要事件来刻画:信号诞生;信号在进程中注册完毕;信号在进程中的注销完毕;信号处理函数执行完毕。相邻两个事件的时间间隔... 阅读全文

posted @ 2013-07-07 13:25 疯子123 阅读(117) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——sigqueue、sigsuspend函数
摘要:一、sigqueue函数功能:新的发送信号系统调用,主要是针对实时信号提出的支持信号带有参数,与函数sigaction()配合使用。int sigqueue(pid_t pid, int sig, const union sigval value);参数: sigqueue的第一个参数是指... 阅读全文

posted @ 2013-07-07 10:55 疯子123 阅读(173) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——可靠信号与不可靠信号
摘要:在早期的UNIX中信号是不可靠的,不可靠在这里指的是:信号可能丢失,一个信号发生了,但进程却可能一直不知道这一点。 现在Linux 在SIGRTMIN实时信号之前的都叫不可靠信号,这里的不可靠主要是不支持信号队列,就是当多个信号发生在进程中的时候(收到信号的速度超过进程处理的... 阅读全文

posted @ 2013-07-07 09:33 疯子123 阅读(202) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——信号(API)
摘要:一、信号在内核中的表示 实际执行信号的处理动作称为信号递达(Delivery),信号从产生到递达之间的状态,称为信号未决(Pending)。进程可以选择阻塞(Block)某个信号。被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作。注意,阻塞和忽略是不同的,只要... 阅读全文

posted @ 2013-07-06 21:56 疯子123 阅读(210) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——信号之kill、raise、killpg、alarm、pause、abort、sleep、usleep、nanosleep和setitimer函数
摘要:一、kill, raise, killpg 函数int kill(pid_t pid, int sig);int raise(int sig);int killpg(int pgrp, int sig);kill命令是调用kill函数实现的,kill函数可以给一个指定的进程或进程组发送指定的信号,... 阅读全文

posted @ 2013-07-06 17:42 疯子123 阅读(627) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——信号基本概述和signal函数
摘要:一、为了理解信号,先从我们最熟悉的场景说起:1. 用户输入命令,在Shell下启动一个前台进程。2. 用户按下Ctrl-C,这个键盘输入产生一个硬件中断。3. 如果CPU当前正在执行这个进程的代码,则该进程的用户空间代码暂停执行,CPU从用户态切换到内核态处理硬件中断。4. 终端驱动程序将Ctrl... 阅读全文

posted @ 2013-07-06 16:13 疯子123 阅读(151) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——进程关系
摘要:一、终端的概念在UNIX系统中,用户通过终端登录系统后得到一个Shell进程,这个终端成为Shell进程的控制终端(Controlling Terminal),控制终端是保存在PCB中的信息,而我们知道fork会复制PCB中的信息,因此由Shell进程启动的其它进程的控制终端也是这个终端。默认情况... 阅读全文

posted @ 2013-07-06 15:54 疯子123 阅读(125) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——system函数
摘要:system函数功能:调用fork产生子进程,由子进程来调用;/bin/sh -c command来执行参数command所代表的命令,阻塞当前进程直到command命令执行完毕。int system(const char *command);因为system在其实现中调用了fork、exec和w... 阅读全文

posted @ 2013-07-06 15:19 疯子123 阅读(172) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——进程基本概述
摘要:一、什么是进程从用户的角度来看进程是程序的一次执行过程。从操作系统的核心来看,进程是操作系统分配的内存、CPU时间片等资源的基本单位。进程是资源分配的最小单位。每一个进程都有自己独立的地址空间与执行状态。像UNIX这样的多任务操作系统能够让许多程序同时运行,每一个运行着的程序就构成了一个进程。二、... 阅读全文

posted @ 2013-07-06 11:35 疯子123 阅读(211) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——进程控制
摘要:一、进程标识符 ID为0的进程是调度进程,常常被称为交换进程。该进程是内核的一部分,它并不执行任何磁盘上的程序,因此也被称为系统进程。进程ID 1通常是init进程,在自举过程结束时由内核调用。init通常读与系统有关的初始化文件,并将系统引导到一个状态(例如多用户)。init进程决不会终... 阅读全文

posted @ 2013-07-06 11:25 疯子123 阅读(158) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——进程环境
摘要:一、main函数 C程序总是从main函数开始。当内核执行C程序时,在调用main前先调用一个特殊的启动例程。可执行程序文件将此启动例程指定为程序的起始地址——这是由连接编译器设置的,而连接编译器则由C编译器调用(通常是cc)。启动例程从内核取得命令行参数和环境变量值。然后调用main函数... 阅读全文

posted @ 2013-07-06 09:44 疯子123 阅读(281) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——时间和日期
摘要:由UNIX内核提供的基本时间服务是计算自国际标准时间公元1970年1月1日00:00:00以来经过的秒数。这种秒数是以数据类型time_t表示。 1. time函数返回当前时间和日期:time_t time(time_t *calptr); 时间值总是作为函数返回。... 阅读全文

posted @ 2013-07-05 17:53 疯子123 阅读(308) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——Linux进程地址空间和虚拟内存
摘要:一、虚拟内存分段机制:即分成代码段,数据段,堆栈段。每个内存段都与一个特权级相关联,即0~3,0具有最高特权级(内核),3则是最低特权级(用户),每当程序试图访问(权限又分为可读、可写和可执行)一个段时,当前特权级CPL就会与段的特权级进行比较,以确定是否有权限访问。每个特权级都有自己的程序栈,当... 阅读全文

posted @ 2013-07-05 17:19 疯子123 阅读(173) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——标准I/O库函数和Unbuffered I/O函数
摘要:以写文件为例,C标准I/O库函数(printf(3) 、putchar(3) 、fputs(3) )与系统调用write(2) 的关 系如下图所示。 库函数与系统调用的层次关系open 、read 、write 、close 等系统函数称为无缓冲I/O(Unbuffered I/O)函数,因为它... 阅读全文

posted @ 2013-07-05 16:55 疯子123 阅读(102) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——标准I/O库缓冲区和内核缓冲区的区别
摘要:1.C标准库的I/O缓冲区 UNIX的传统 是Everything is a file,键盘、显示器、串口、磁盘等设备在/dev 目录下都有一个特殊的设备文件与之对应,这些设备文件也可以像普通文件(保存在磁盘上的文件)一样打开、读、写和关闭,使用的函数接口是相同的。用户程序调用C标... 阅读全文

posted @ 2013-07-05 13:21 疯子123 阅读(131) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——标准I/O库
摘要:对一个进程预定义了三个流,并且这三个流可以自动的被进程使用,它们是:标准输入、标准输出、和标准错误。 标准I/O库提供缓冲的目的是尽可能减少使用read和write的次数。 标准I/O库提供了三种类型的缓冲:(1)全缓冲:在填满标准I/O缓冲区后进行实际I/O操作。对于驻留在磁... 阅读全文

posted @ 2013-07-05 12:09 疯子123 阅读(131) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——文件和目录
摘要:一、获取文件/目录的属性信息int stat(const char *path, struct stat *buf);int fstat(int fd, struct stat *buf);int lstat(const char *path, struct stat *buf);struct s... 阅读全文

posted @ 2013-07-04 18:28 疯子123 阅读(221) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——文件I/O
摘要:一、文件描述符对于Linux而言,所有对设备或文件的操作都是通过文件描述符进行的。当打开或者创建一个文件的时候,内核向进程返回一个文件描述符(非负整数)。后续对文件的操作只需通过该文件描述符,内核记录有关这个打开文件的信息(file结构体)。一个进程启动时,默认打开了3个文件,标准输入、标准输出、... 阅读全文

posted @ 2013-07-04 12:53 疯子123 阅读(230) 评论(0) 推荐(0) 编辑

UNIX环境高级编程——UNIX基础知识
摘要:1.用户在登陆linux系统时,先键入登录名,然后键入口令。系统在其口令文件(通常是/etc/passwd文件)中查看登录名。口令文件中的登陆项由7个以冒号分隔的字段组成,它们是:登录名、加密口令、数值用户ID、数值组ID、注释字段、起始目录以及shell程序。huangcheng:x:1000:... 阅读全文

posted @ 2013-07-04 11:48 疯子123 阅读(135) 评论(0) 推荐(0) 编辑

Linux的启动流程 (二)
摘要:引:本文以RedHat9.0和i386平台为例,剖析了从用户打开电源直到屏幕出现命令行提示符的整个Linux启动过程。并且介绍了启动中涉及到的各种文件。阅读Linux源代码,无疑是深入学习Linux的最好方法。在本文对Linux启动过程的介绍中,我们也尝试从源代码的视角来更深入的剖析Linux 的... 阅读全文

posted @ 2013-07-03 13:22 疯子123 阅读(127) 评论(0) 推荐(0) 编辑

Linux的启动流程(一)
摘要:· 启动第一步--加载BIOS当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它。这是因为BIOS中包含了CPU的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、PnP特性等等。在此之后,计算机心里就有谱了,知道应该去读取哪个硬件... 阅读全文

posted @ 2013-07-03 13:19 疯子123 阅读(125) 评论(0) 推荐(0) 编辑

STL学习系列之一——标准模板库STL介绍
摘要:库是一系列程序组件的集合,他们可以在不同的程序中重复使用。C++语言按照传统的习惯,提供了由各种各样的函数组成的库,用于完成诸如输入/输出、数学计算等功能。1. STL介绍标准模板库STL是当今每个从事C++编程的人需要掌握的技术,所有很有必要总结下本文将介绍STL并探讨它的三个主要概念:容器、迭... 阅读全文

posted @ 2013-07-03 13:15 疯子123 阅读(217) 评论(0) 推荐(0) 编辑

STL:STL各种容器的使用时机详解
摘要:C++标准程序库提供了各具特长的不同容器。现在的问题是:该如何选择最佳的容器类别?下表给出了概述。但是其中有些描述可能不一定实际。例如:如果你需呀处理的元素数量很少,可以虎落复杂度,因为线性算法通常对元素本身的处理过程比较快,这种情况下,“显性复杂度搭配快速的元素处理”要比“对数复杂度搭配慢的元素... 阅读全文

posted @ 2013-07-03 13:14 疯子123 阅读(120) 评论(0) 推荐(0) 编辑

STL:map/multimap用法详解
摘要:map/multimap 使用map/multimap之前要加入头文件#include,map和multimap将key/value当作元素,进行管理。它们可根据key的排序准则自动将元素排序。multimap允许重复元素,map不允许重复元素。map和multimap内部的数据结构也是平衡... 阅读全文

posted @ 2013-07-03 13:13 疯子123 阅读(443) 评论(0) 推荐(0) 编辑

STL:set/multiset用法详解
摘要:集合使用set或multiset之前,必须加入头文件Set、multiset都是集合类,差别在与set中不允许有重复元素,multiset中允许有重复元素。sets和multiset内部以平衡二叉树实现1. 常用函数1) 构造函数和析构函数set c:创建空集合,不包含任何元素s... 阅读全文

posted @ 2013-07-03 13:11 疯子123 阅读(421) 评论(0) 推荐(0) 编辑

STL:list用法详解
摘要:list容器介绍相对于vector容器的连续线性空间,list是一个双向链表,它有一个重要性质:插入操作和删除操作都不会造成原有的list迭代器失效,每次插入或删除一个元素就配置或释放一个元素空间。也就是说,对于任何位置的元素插入或删除,list永远是常数时间。常用函数(1) 构造函数lis... 阅读全文

posted @ 2013-07-03 13:10 疯子123 阅读(201) 评论(0) 推荐(0) 编辑

STL:deque用法详解
摘要:deque函数:deque容器为一个给定类型的元素进行线性处理,像向量一样,它能够快速地随机访问任一个元素,并且能够高效地插入和删除容器的尾部元素。但它又与vector不同,deque支持高效插入和删除容器的头部元素,因此也叫做双端队列。deque类常用的函数如下。(1) 构造函数deque... 阅读全文

posted @ 2013-07-03 13:08 疯子123 阅读(212) 评论(0) 推荐(0) 编辑

STL:vector容器用法详解
摘要:vector类称作向量类,它实现了动态数组,用于元素数量变化的对象数组。像数组一样,vector类也用从0开始的下标表示元素的位置;但和数组不同的是,当vector对象创建后,数组的元素个数会随着vector对象元素个数的增大和缩小而自动变化。 vector类常用的函数如下所示: 1.... 阅读全文

posted @ 2013-07-03 13:07 疯子123 阅读(129) 评论(0) 推荐(0) 编辑

STL:字符串用法详解
摘要:字符串是程序设计中最复杂的变成内容之一。STL string类提供了强大的功能,使得许多繁琐的编程内容用简单的语句就可完成。string字符串类减少了C语言编程中三种最常见且最具破坏性的错误:超越数组边界;通过违背初始化或被赋以错误值的指针来访问数组元素;以及在释放了某一数组原先所分配的存储单元后... 阅读全文

posted @ 2013-07-03 13:05 疯子123 阅读(477) 评论(0) 推荐(0) 编辑

C++ Primer 有感(管理类的指针成员)
摘要:C++类的指针成员与其他成员有所不同,指针成员指向一个内存地址,该地址的内存需要我没管理。我现在分析一下为什么要管理指针成员。有如下Student类,Student.h如下:[cpp] view plaincopyclass Student { public: Student(i... 阅读全文

posted @ 2013-07-03 13:03 疯子123 阅读(138) 评论(0) 推荐(0) 编辑

C++ Primer 有感(标准库set类型)
摘要:set容器只是单纯的键的集合,键必须为一。set容器不支持下标操作,而且没有定义maped_type类型。在set容器中,value_type不是pair类型,而是与key_type类型相同的类型。1.在set中添加元素set set1;set1.insert("the");set1.insert... 阅读全文

posted @ 2013-07-03 13:02 疯子123 阅读(97) 评论(0) 推荐(0) 编辑

C++ Primer 有感(标准库pair)
摘要:与关联容器相关的模板类型,包含两个数据成员,在utility头文件中定义.pair类型提供的操作:pair p1;pair p1(v1,v2);make_pair(v1,v2);p1 name; pair> data;以上全部调用pair类型的默认构造函对其成员进行数值初始化,成员初始化为空... 阅读全文

posted @ 2013-07-03 13:00 疯子123 阅读(102) 评论(0) 推荐(0) 编辑

C++ Primer 有感(标准库vector及迭代器)
摘要:vector是同一种对象的集合,每个对象都有一个对应的整数索引值。和string对象一样,标准库将负责管理与存储元素相关的类存。引入头文件#include1.vector对象的定义和初始化vector v1 vector保存类型为T的对象。默认构造函数,v1为空 vect... 阅读全文

posted @ 2013-07-03 12:58 疯子123 阅读(110) 评论(0) 推荐(0) 编辑

C++ Primer 有感(标准库map类型)
摘要:map是键-值对的集合。map类型通常可以理解为关联数组:可以使用键作为下标获取一个值,正如内置数组一样。而关联的本质在于元素的值于某个特定的键相关联,而并非通过元素在数组中的位置获取。1.map对象的定义要使用map对象,则必须包含map头文件。在定义map对象时,必须分别指明键和值得类型map... 阅读全文

posted @ 2013-07-03 12:53 疯子123 阅读(105) 评论(0) 推荐(0) 编辑

C++ Primer 有感(命名空间)
摘要:1.命名空间定义以关键字namespace开始,后接命名空间的名字。 2.命名空间可以在全局作用域或其他作用域内部定义,但不能在函数或类内部定义。 3.定义在命名空间中的实体称为命名空间的成员。像任意作用域的情况一样,命名空间中的每个名字必须引用该命名空间的唯一实体。 4.与其他作用域不同,命名空... 阅读全文

posted @ 2013-07-03 11:12 疯子123 阅读(127) 评论(0) 推荐(0) 编辑

C语言的预编译
摘要:由“源代码”到“可执行文件”的过程包括四个步骤:预编译、编译、汇编、链接。所以,首先就应该清楚的首要问题就是:预编译只是对程序的文本起作用,换句话说就是,预编译阶段仅仅对源代码的单词进行变换,而不是对程序中的变量、函数等。 预编译指令的基本知识不作详细介绍,只稍作汇总,重点是后面的我... 阅读全文

posted @ 2013-07-03 09:59 疯子123 阅读(518) 评论(0) 推荐(0) 编辑

C语言的布尔类型(_Bool)
摘要:也许很多人都和我一样,不知道现在的C语言已经有了布尔型:从C99标准开始,类型名字为“_Bool”。 在此之前的C语言中,使用整型int来表示真假。在输入时:使用非零值表示真;零值表示假。在输出时:真的结果是1,假的结果是0;(这里我所说的“输入”,意思是:当在一个需要布尔值的地方,... 阅读全文

posted @ 2013-07-03 09:56 疯子123 阅读(755) 评论(0) 推荐(1) 编辑

C语言有关指针的变量声明中的几个易错点
摘要:Technorati 标签: 指针,typedef,const,define 我们都知道,至少听说过指针对于C语言中的重要意义,但是在使用指针时却常常让我们痛不欲生,这里有几个在声明指针有关的变量时易错的地方。1. int* 和 int * (注意空格的位置) 对于... 阅读全文

posted @ 2013-07-03 09:37 疯子123 阅读(378) 评论(0) 推荐(0) 编辑

C语言中标识符的作用域、命名空间、链接属性、生命周期、存储类型
摘要:Technorati 标签: C,标识符,作用域,命名空间,链接属性,生命周期,存储类型,scope,name space,linkage,storage durations,lifetime 无论学习哪一种语言,都免不了要讨论这些问题。而且这些问题,深究起来有时也让我们很迷惑。 ... 阅读全文

posted @ 2013-07-03 09:25 疯子123 阅读(394) 评论(0) 推荐(0) 编辑

常见排序算法
摘要:索引1. 插入排序 1.1 直接插入 1.2 折半插入 1.3 希尔排序 2. 交换排序 2.1 冒泡排序 2.2 快速排序 3. 选择排序 3.1 直接选择 3.2 堆排序 4. 归并排序 4.1 迭代归并 总结 1. 插入排序... 阅读全文

posted @ 2013-07-03 08:59 疯子123 阅读(128) 评论(0) 推荐(0) 编辑

C++在单继承、多继承、虚继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容
摘要:一、本文目的与说明 1. 本文目的:理清在各种继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容。 2. 说明:虽然复制构造函数属于构造函数的一种,有共同的地方,但是也具有一定的特殊性,所以在总结它的性质时将它单独列出来了。 3. 单继承、多继承、虚继承,既... 阅读全文

posted @ 2013-07-03 08:57 疯子123 阅读(177) 评论(0) 推荐(0) 编辑

C++ Primer 有感(异常处理)(四)
摘要:查看普通函数的声明的时候,不可能知道该函数会抛出什么异常,但是在捕获异常的时候要知道一个函数会抛出什么样的异常,以便捕获异常。异常说明:指定,如果函数抛出异常,抛出的异常将是包含在该说明中的一种,或者是从列出的异常中派生的类型。1.定义异常说明异常说明跟在形参表后。一个异常说明在关键字throw之... 阅读全文

posted @ 2013-07-02 17:34 疯子123 阅读(130) 评论(0) 推荐(0) 编辑

C++ Primer 有感(异常处理)(三)
摘要:先看下面的代码:[cpp] view plaincopyint main() { int *i=new int(10); /* 这中间的代码出现异常 */ delete i; return 0; } 如果出现了这... 阅读全文

posted @ 2013-07-02 17:33 疯子123 阅读(153) 评论(0) 推荐(0) 编辑

C++ Primer 有感(异常处理)(二)
摘要:异常就是运行时出现的不正常,例如运行时耗尽了内存或遇到意外的非法输入。异常存在于程序的正常功能之外,并要求程序立即处理。不能不处理异常,异常是足够重要的,使程序不能继续正常执行的事件。如果找不到匹配的catch,程序就调用库函数terminate。 如果不处理异常将会出现上图的效果。下面是处理异常... 阅读全文

posted @ 2013-07-02 16:34 疯子123 阅读(151) 评论(0) 推荐(0) 编辑

C++ Primer 有感(异常处理)
摘要:1.异常是通过抛出对象而引发的。该对象的类型决定应该激活哪个处理代码。被选中的处理代码是调用链中与该对象类型匹配且离抛出异常位置最近的那个。2.执行throw的时候,不会执行跟在throw后面的语句,而是将控制从throw转移到匹配的catch,该catch可以是同一函数中局部的catch,也可以... 阅读全文

posted @ 2013-07-02 11:17 疯子123 阅读(213) 评论(0) 推荐(0) 编辑

C++ Primer 有感(多重继承与虚继承)
摘要:1.多重继承的构造次序:基类构造函数按照基类构造函数在类派生列表中的出现次序调用,构造函数调用次序既不受构造函数初始化列表中出现的基类的影响,也不受基类在构造函数初始化列表中的出现次序的影响。2.在单个基类情况下,派生类的指针或引用可以自动转换为基类的指针或引用,对于多重继承也是如此,派生类的指针... 阅读全文

posted @ 2013-07-01 14:53 疯子123 阅读(197) 评论(0) 推荐(0) 编辑

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示