上一页 1 ··· 19 20 21 22 23 24 25 26 27 ··· 59 下一页
  2013年1月22日
摘要: 最近有人提到char和unsigned char有什么区别,当然这个问题如果刚学计算机或者编程语言的人来说,非常简单。我也这么认为,无非就是有符号和无符号的差别嘛。这个问题让我想到了以前学习计算机常识的时候关于补码,原码,反码的差异。这里摘取参考文章【1】中的部分内容:注意:此处的'=='是相等的意思。'='是赋值的意思。在机器世界里:正数的最高位是符号位0,负数的最高位是符号位1。对于正数:反码==补码==原码。对于负数:反码==除符号位以外的各位取反。 补码==反码+1. 原码==补码-1后的反码==补码的反码+1。(读完本文后,应该能够直观地认识到本式的正 阅读全文
posted @ 2013-01-22 16:28 一个人的天空@ 阅读(11819) 评论(0) 推荐(1) 编辑
  2013年1月18日
摘要: 长连接和短连接TCP/IP编程具有较为丰富的内容。其编程的丰富性主要体现在通信方式和报文格式的多样性上。通信方式 主要有以下三大类:(一)SERVER/CLIENT方式1.一个Client方连接一个Server方,或称点对点(peer to peer):2.多个Client方连接一个Server方,这也是通常的并发服务器方式。(二)连接方式1.长连接Client方与Server方先建立通讯连接,连接建立后不断开,然后再进行报文发送和接收。这种方式下由于通讯连接一直存在,可以用下面命令查看连接是否建立:netstat-f inet|grep端口号(如5678)。 此种方式常用于点对点通讯。2.短 阅读全文
posted @ 2013-01-18 11:40 一个人的天空@ 阅读(1360) 评论(0) 推荐(0) 编辑
摘要: epoll是做为一个虚拟文件系统来实现的,这样做至少有以下两个好处:1、可以在内核里维护一些信息,这些信息在多次epoll_wait间是保持的,比如所有受监控的文件描述符。2、epoll本身也可以被poll/epoll; 【1】epoll的实现中,所等待的设备就绪后,便调用call_back函数,把该设备加入到就绪队列中,避免了像poll那样设备就绪后再次轮询所有设备找就绪者,由O(n)降到O(1)。 传统的poll函数相当于每次调用都重起炉灶,从用户空间完整读入ufds,完成后再次完全拷贝到用户空间,另外每次poll都需要对所有设备做至少做一次加入和删除等待队列操作,这些都是低效的原因。3、 阅读全文
posted @ 2013-01-18 11:30 一个人的天空@ 阅读(252) 评论(0) 推荐(0) 编辑
摘要: 1、epoll使用模型示例程序1View Codefor(;;){ nfds = epoll_wait(epfd, events, 20, 500); for(i =0; i < nfds; ++i) { if(events[i].data.fd == listenfd) //监测到有新的连接 { connfd = accept(listenfd, (sockaddr *)&clientaddr, &clilen); //accept这个连接 ev.data.fd = connfd; ... 阅读全文
posted @ 2013-01-18 11:20 一个人的天空@ 阅读(271) 评论(0) 推荐(0) 编辑
摘要: 1、基于概念 epoll是一种机制,来处理大量并发连接时事件的读写顺序。在linux的网络编程中,很长的时间都在使用select来做事件触发。2.5.X内核后,引入epoll。epoll是Linux内核为处理大批量句柄而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著减少程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。因为它不会复用文件描述符集合来传递结果而迫使开发者每次等待事件之前都必须重新准备要被侦听的文件描述符集合,另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的 阅读全文
posted @ 2013-01-18 10:30 一个人的天空@ 阅读(327) 评论(0) 推荐(0) 编辑
摘要: 1、recv和send函数提供了和read和write差不多的功能。但是他们提供了第四个参数来控制读写操作.int recv(int sockfd,void *buf,int len,int flags)int send(int sockfd,void *buf,int len,int flags)前面的三个参数和read,write相同,第四个参数能够是0或是以下的组合:_______________________________________________________________| MSG_DONTROUTE |不查找路由表|| MSG_OOB |接受或发送带外数据|| MS 阅读全文
posted @ 2013-01-18 09:59 一个人的天空@ 阅读(8507) 评论(0) 推荐(0) 编辑
摘要: 1、一般来说,一个端口释放后会等待两分钟之后才能再被使用,SO_REUSEADDR是让端口释放后立即就可以被再次使用。SO_REUSEADDR用于对TCP套接字处于TIME_WAIT状态下的socket,才可以重复绑定使用。server程序总是应该在调用bind()之前设置SO_REUSEADDR套接字选项。TCP,先调用close()的一方会进入TIME_WAIT状态2、SO_REUSEADDR和SO_REUSEPORTSO_REUSEADDR提供如下四个功能:SO_REUSEADDR允许启动一个监听服务器并捆绑其众所周知端口,即使以前建立的将此端口用做他们的本地端口的连接仍存在。这通常是重 阅读全文
posted @ 2013-01-18 09:54 一个人的天空@ 阅读(64448) 评论(0) 推荐(5) 编辑
摘要: 10、Linux环境下的##连接符与args...混合使用 前面【1】中叙述了#,##的使用方法,【2】中叙述了va_list的使用方法。【1】http://www.cnblogs.com/mydomain/archive/2010/09/25/1834917.html【2】http://www.cnblogs.com/mydomain/archive/2010/12/06/1898187.html在Linux下,还有一种使用形式,如下:#define NO_DATA(fmt, args...) \{\fprintf(stdout, fmt, ##args);\}int main(int ar 阅读全文
posted @ 2013-01-18 09:45 一个人的天空@ 阅读(375) 评论(0) 推荐(0) 编辑
摘要: 1、fcntl头文件#include <fcntl.h>#include <fcntl.h>定义函数int fcntl(int fd , int cmd);int fcntl(int fd,int cmd,long arg);int fcntl(int fd,int cmd,struct flock * lock);fcntl()用来操作文件描述符的一些特性。参数fd代表欲设置的文件描述词,参数cmd代表欲操作的指令。其详细情况见参考中。【1】http://linux.die.net/man/2/fcntl【2】http://baike.baidu.com/view/1 阅读全文
posted @ 2013-01-18 09:16 一个人的天空@ 阅读(1511) 评论(0) 推荐(0) 编辑
  2013年1月17日
摘要: 读写锁 (rwlock)功能特点简介读写锁实际是一种特殊的自旋锁,它把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。这种锁相对于自旋锁而言,能提高并发性,因为在多处理器系统中,它允许同时有多个读者来访问共享资源,最大可能的读者数为实际的逻辑CPU数。写者是排他性的,一个读写锁同时只能有一个写者或多个读者(与CPU数相关),但不能同时既有读者又有写者。在读写锁保持期间也是抢占失效的。如果读写锁当前没有读者,也没有写者,那么写者可以立刻获得读写锁,否则它必须自旋在那里,直到没有任何写者或读者。如果读写锁没有写者,那么读者可以立即获得该读写锁,否则读 阅读全文
posted @ 2013-01-17 14:43 一个人的天空@ 阅读(2429) 评论(0) 推荐(0) 编辑
摘要: 9、多线程小结(2)3)合并线程:pthread_join int pthread_join(pthread_t* thread, void **ret); 第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。关于什么是可joinable的线程,参见[3]。4)通过到斥实现线程同步(1)声明互斥锁变量:pthread_mutext_tmutex;pthread_mutex_t为不公开的数据类型,其中包含一个系统分配的属性对象。(2)互斥 阅读全文
posted @ 2013-01-17 14:36 一个人的天空@ 阅读(192) 评论(0) 推荐(0) 编辑
摘要: 8、多线程小结(1)1、在Linux中,线程一般被认为是“轻量级的进程”。Linux创建进程所使用的函数是fork()或者vfork()。而对线程的创建和管理Linux可以使用POSIX的线程库pthreads提供的APIs。2、使用fork()创建进程和使用POSIX线程库差别:使用fork()创建进程的特点:①代价昂贵,通常子进程需要拷贝父进程的整个上下文,比如数据等。②进程间的通信方式比较复杂,比如使用管道、消息、共享内存等方法。③操作系统在实现进程间的切换比线程切换更费时。使用POSIX pthreads库创建线程的特点:①线程可使用存在于进程中的资源,因此创建进程比创建线程更快。②线 阅读全文
posted @ 2013-01-17 14:31 一个人的天空@ 阅读(220) 评论(0) 推荐(0) 编辑
摘要: 7、取消点的进一步讨论线程取消的方法是向目标线程发Cancel信号,但如何处理Cancel信号则由目标线程自己决定,或者忽略、或者立即终止、或者继续运行至Cancelation-point(取消点),由不同的Cancelation状态决定。线程接收到CANCEL信号的缺省处理(即pthread_create()创建线程的缺省状态)是继续运行至取消点,也就是说设置一个CANCELED状态,线程继续运行,只有运行至Cancelation-point的时候才会退出。(1)什么是线程取消点根据POSIX标准,pthread_join()、pthread_testcancel()、pthread_con 阅读全文
posted @ 2013-01-17 14:15 一个人的天空@ 阅读(190) 评论(0) 推荐(0) 编辑
摘要: 6、一个 pthread_cancel 引起的线程死锁【整理转载】说明:本文由【2,3】整理而得。这篇文章主要从一个 Linux下一个pthread_cancel函数引起的多线程死锁小例子出发来说明Linux系统对POSIX线程取消点的实现方式,以及如何避免因此产生的线程死锁。目 录:1.一个pthread_cancel引起的线程死锁小例子2.取消点(Cancellation Point)3.取消类型(Cancellation Type)4. Linux的取消点实现5.对示例函数进入死锁的解释6.如何避免因此产生的死锁7.结论8.参考文献1.一个pthread_cancel引起的线程死锁小例子 阅读全文
posted @ 2013-01-17 14:11 一个人的天空@ 阅读(322) 评论(0) 推荐(0) 编辑
摘要: pthread_cleanup_push/pthread_cleanup_pop() 以下内容根据【1】进行整理。关于取消点,将在后面进一步讨论。1、一般来说,Posix的线程终止有两种情况:正常终止和非正常终止。线程主动调用pthread_exit()或者从线程函数中return都将使线程正常退出,这是可预见的退出方式;非正常终止是线程在其他线程的干预下,或者由于自身运行出错(比如访问非法地址)而退出,这种退出方式是不可预见的。2、线程终止时的清理不论是可预见的线程终止还是异常终止,都会存在资源释放的问题,在不考虑因运行出错而退出的前提下,如何保证线程终止时能顺利的释放掉自己所占用的资源,特 阅读全文
posted @ 2013-01-17 13:55 一个人的天空@ 阅读(179) 评论(0) 推荐(0) 编辑
上一页 1 ··· 19 20 21 22 23 24 25 26 27 ··· 59 下一页