C/C++编程
Ethan_Novice
这个作者很懒,什么都没留下…
展开
-
一个简单聊天室的两种实现 (fcntl 和 select)
在互联网相当普及的今天,在互联网上聊天对很多“网虫”来说已经是家常便饭了。聊天室程序可以说是网上最简单的多点通信程序。聊天室的实现方法有很多,但都是利用所谓的“多用户空间”来对信息进行交换,具有典型的多路I/O的架构。一个简单的聊天室, 从程序员的观点来看就是在多个I/O端点之间实现多对多的通信。其架构如图一所示。这样的实现在用户的眼里就是聊天室内任何一个人输入一段字符之后,其他用户都可以得到这一转载 2011-11-29 14:36:54 · 517 阅读 · 0 评论 -
GDB多进程调试(转)
GDB 是 linux 系统上常用的 c/c++ 调试工具,功能十分强大。对于较为复杂的系统,比如多进程系统,如何使用 GDB 调试呢?考虑下面这个三进程系统:进程 Proc2 是 Proc1 的子进程,Proc3 又是 Proc2 的子进程。如何使用 GDB 调试 proc2 或者 proc3 呢?实际上,GDB 没有对多进程程序调试提供直接支持。例如,使用GDB调试某个进程,如转载 2012-02-01 20:19:36 · 728 阅读 · 0 评论 -
Linux消息队列之命令行相关
一、消息队列 (也叫做报文队列)是Unix系统V版本中3种进程间通信机制之一。另外两种是信号灯和共享内存。这些IPC机制使用共同的授权方法。只有通过系统调用将标志符传递给核心之后,进程才能存取这些资源。这种系统IPC对象使用的控制方法和文件系统非常类似。使用对象的引用标志符作为资源表中的索引。消息队列就是一个消息的链表。就是把消息看作一个记录,并且这个记录具有特定的格式以及特定的优先级。对原创 2012-02-01 10:50:53 · 9128 阅读 · 0 评论 -
Gdb调试多进程程序
Gdb调试多进程程序程序经常使用fork/exec创建多进程程序。多进程程序有自己独立的地址空间,这是多进程调试首要注意的地方。Gdb功能强大,对调试多线程提供很多支持。方法1:调试多进程最土的办法:attach pidAttach是调试进程的常用办法,只要有可执行程序以及相应PID,即可工作。当然,为方便调试,可以在进程启动后,设定sleep一段时间,如30s,这样即可有充足的时间来转载 2012-02-01 21:02:39 · 915 阅读 · 0 评论 -
单纯md5的一个具体实现
/** md5 -- compute and check MD5 message digest.* this version only can calculate the char string.** MD5 (Message-Digest algorithm 5) is a widely used, partially* insecure cryptogr原创 2012-03-07 17:54:28 · 776 阅读 · 0 评论 -
libxml2
libxml2尝试 etc项目中实现一个http server,刚好用到大量的XML,每次处理的数据包XML数据相对较小,先尝试了expat,SAX解析方式确实痛苦,需要自己维护状态树。 libxml2相对功能比较全,SAX、DOM解析方式都有实现,而且还有XPath、XLink等实现,甚至连HTMLparser都有了,下面是我这次用到的一转载 2012-03-19 19:51:33 · 1543 阅读 · 0 评论 -
信号量
linux信号量机制(semaphore) 信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问。当公共资源增加时,调用函数sem_post()增加信号量。只有当信号量值大于0时,才能使用公共资源,使用后,函数sem_wait()减少信号量。函数sem_trywait()和函数pthread_ mutex_trylock()起同样的作用,它是函数sem_wait()的非阻塞版转载 2012-05-30 19:25:42 · 3308 阅读 · 0 评论 -
信号量集
信号量集的操作三个IPC对象类型中,信号量集的操作函数相对于其他两个类型的操作函数要复杂得多,当然信号量的应用也比其他两个更广泛些。像共享内存的操作一样,信号量也有自己的专属操作函数semctl,函数原型如下:#include int semctl( int sem_id, int semnu, int cmd [, union semun arg]);原创 2012-05-31 09:58:43 · 2073 阅读 · 1 评论 -
关于SIGPIPE信号
我写了一个服务器程序,在Linux下测试,然后用C++写了客户端用千万级别数量的短链接进行压力测试. 但是服务器总是莫名退出,没有core文件.最后问题确定为, 对一个对端已经关闭的socket调用两次write, 第二次将会生成SIGPIPE信号, 该信号默认结束进程.具体的分析可以结合TCP的"四次挥手"关闭. TCP是全双工的信道, 可以看作两条单工信道, TCP连接两端的两个转载 2012-06-27 10:08:10 · 499 阅读 · 0 评论 -
Unix select()的使用
转载:http://fanqiang.chinaunix.net/a4/b7/20010913/0900001283.html,部分不明白的地方做了补充用过 WinSock API 网友们知道:WinSock 编程中有一很方便的地方便是其消息驱动机制,不管是底层API 的 WSAAsyncSelect() 还是 MFC 的异步Socket类:CAsyncSocket,都提供了诸如 FD_ACC转载 2011-11-28 11:53:30 · 3356 阅读 · 0 评论 -
移位运算符
移位运算符就是在二进制的基础上对数字进行平移。按照平移的方向和填充数字的规则分为三种:(左移)、>>(带符号右移)和>>>(无符号右移)。 在移位运算时,byte、short和char类型移位后的结果会变成int类型,对于byte、short、char和int进行移位时,规定实际移动的次数是移动次数和32的余数,也就是移位33次和移位1次得到的结果相同。移动long型的数值时,规定实转载 2012-07-23 10:17:50 · 500 阅读 · 0 评论 -
char 与 unsigned char的本质区别
在C中,默认的基础数据类型均为signed,现在我们以char为例,说明(signed) char与unsigned char之间的区别 首先在内存中,char与unsigned char没有什么不同,都是一个字节,唯一的区别是,char的最高位为符号位,因此char能表示-128~127, unsigned char没有符号位,因此能表示0~255,这个好理解,8个bit,最多256种情况,转载 2012-08-17 13:31:56 · 750 阅读 · 0 评论 -
大端小端(Big- Endian和Little-Endian)
在各种计算机体系结构中,对于字节、字等的存储机制有所不同,因而引发了计算机通信领 域中一个很重要的问题,即通信双方交流的信息单元(比特、字节、字、双字等等)应该以什么样的顺序进行传送。如果不达成一致的规则,通信双方将无法进行正 确的编/译码从而导致通信失败。目前在各种体系的计算机中通常采用的字节存储机制主要有两种:Big-Endian和Little-Endian,下面先 从字节序说起。转载 2012-07-30 11:47:47 · 1533 阅读 · 1 评论 -
makefile(这哥们很强,看完这篇文章,自己写makefile肯定能过关了)
跟我一起写MAKEFILE 陈皓 概述 —— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成转载 2012-01-15 12:55:50 · 5038 阅读 · 0 评论 -
UNIX下的select详细说明
Part 1:经典的Unix select系统调用: for( ;; ) { tv.tv_sec = 30; tv.tv_usec = 0; FD_ZERO( &rfds ); FD_SET( sockfd, &rfds );原创 2011-11-29 12:30:04 · 1363 阅读 · 0 评论 -
UNIX.signal
1 Introduction & ConceptsSignals是一种软件中断,通知程序某种事件的发生。常见的Signal有SIGABRT(当进程调用abort函数的时候自动发送), SIGALRM(当timer被触发的时候自动发送),等等。下面的情况可以产生Signal:1. 按下CTRL+C产生SIGINT2. 硬件中断,如除0,非法内存访问(SIGSEV)等等转载 2011-11-29 15:22:33 · 748 阅读 · 0 评论 -
fcntl和flock两个系统调用的区别
总的来说,flock函数只能锁定整个文件,无法锁定文件的某一区域。而fcntl可以利用struct flock结构体,来实现文件里部分区域锁定的操作。fcntl(文件描述词操作) 相关函数 open,flock表头文件 #include #include定义函数 int fcntl(int fd , int cmd); int fcntl(int fd原创 2011-11-29 14:21:48 · 551 阅读 · 0 评论 -
系统调用msgget()
如果希望创建一个新的消息队列,或者希望存取一个已经存在的消息队列,你可以使用系统调用msgget()。 系统调用:msgget(); 原型:int msgget(key_t key,int msgflg); 返回值:如果成功,返回消息队列标识符 如果失败,则返回-1:errno=EACCESS(权限不允许) EEXIST(队列已经存在,无法创建) EIDRM(队转载 2011-11-29 14:58:55 · 2136 阅读 · 0 评论 -
dup和dup2
相信大部分在Unix/Linux下编程的程序员手头上都有《Unix环境高级编程》(APUE)这本超级经典巨著。作者在该书中讲解dup/dup2之前曾经讲过“文件共享”,这对理解dup/dup2还是很有帮助的。这里做简单摘录以备在后面的分析中使用: Stevens said: (1) 每个进程在进程表中都有一个记录项,每个记录项中有一张打开文件描述符表,可将视为一个矢量,每个描述转载 2011-12-09 14:06:57 · 447 阅读 · 0 评论 -
Ubuntu下编译C程序
.a静态库 (archive).cC源代码(需要编译预处理).hC源代码头文件.iC源代码(不需编译预处理).o对象文件.s汇编语言代码.so动态库 单个源文件生成可执行程序下面是一个简单的“hello, ubuntu”程序的源代码:/* helloubuntu.转载 2011-11-24 17:14:19 · 4260 阅读 · 2 评论 -
C中#if 0 和#if 1
当注释掉大块代码时,使用"#if 0"比使用"/**/"要好,因为用"/**/"做大段的注释要防止被注释掉的代码中有嵌套的"/**/",这会导致注释掉的代码区域不是你想要的范围, 当被注释掉的代码很大时容易出现这种情况,特别是过一段时间后又修改该处代码时更是如此。在这里顺便对条件编译(#ifdef, #else, #endif, #if等)进行说明。以下分3种情况: 1. 情况1:转载 2011-12-20 15:26:28 · 393 阅读 · 0 评论 -
mmap详解
mmap功能描述: mmap将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。munmap执行相反的操作,删除特定地址区域的对象映射。基于文件的映射,在mmap和munmap执行过程的任何时刻,被映射文件的st_atime可能被更新。如果st_atime字段在前述的情况下没有得到更新,首次对映射区的第一个页转载 2011-12-23 11:27:04 · 1056 阅读 · 1 评论 -
About GCC printf optimization
About GCC printf optimizationPeter SeidererNovember 30, 2005Abstract:As you may have noticed, your GCC compiled source code is not always calling the functions you wrote in the source co转载 2012-01-10 11:51:52 · 1008 阅读 · 0 评论 -
GCC编译选项-包含的头文件
许多情况下,头文件和源文件会单独存放在不同的目录中。可以直接在.c文件中利用#include“/path/file.h", 通过指定头文件的路径(可以是绝对路径,也可以是相对路径)来包含头文件. 但这明显降低了程序的可移植性. 在别的系统环境下编译可能会出现问题. 所以还是利用"-I"选项指定头文件完整的包含路径. 针对头文件比较多的情况, 最好把它们统一放在一个目录中,比如~/p转载 2012-01-10 21:16:33 · 11412 阅读 · 0 评论 -
linux下C语言多线程编程实例
学东西,往往实例才是最让人感兴趣的,老是学基础理论,不动手,感觉没有成就感,呵呵。下面先来一个实例。我们通过创建两个线程来实现对一个数的递加。或许这个实例没有实际运用的价值,但是稍微改动一下,我们就可以用到其他地方去。下面是我们的代码:/*MutiThreads.c: Mutiple threads to do testing task.*author : huxl转载 2012-01-10 09:37:11 · 546 阅读 · 0 评论 -
非阻IO与EWOULDBLOCK EAGAIN
默认 socket 是阻塞的,读写函数 read, readv,recv, recvfrom, recvmsg 以及write, writev,send, sendto,sendmsg 都有可能会阻塞。可以将 socket 描述字设为非阻塞,这样,当 socket 描述字未就绪时,调用以上读写函数将会返回 EWOULDBLOCK 或 EAGAIN 。UNPv1 给出了一个转载 2012-01-12 16:43:55 · 7363 阅读 · 1 评论 -
代码学习笔记
msgget功能描述: 获取与某个键关联的消息队列标识。消息队列被建立的情况有两种: 1.如果键的值是IPC_PRIVATE。 2.或者键的值不是IPC_PRIVATE,并且键所对应的消息队列不存在,同时标志中指定IPC_CREAT。 如果新的消息队列被建立,它关联的msqid_ds数据结构初始化如下: msg_perm.cuid 和 msg_p原创 2011-12-14 15:27:00 · 543 阅读 · 0 评论 -
堆和栈的区别
此文章虽然是面向C/C++程序员写得,但是对咱们Java程序员还是很有帮助的。 一、预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由O转载 2013-08-08 13:59:11 · 554 阅读 · 0 评论