C/C++ Linux编程
文章平均质量分 75
tuobana123
从事J2EE开发,熟悉Spring Framework,Hibernate,Mybatis等开源java框架。
展开
-
Epoll在LT和ET模式下的读写方式
在一个非阻塞的socket上调用read/write函数, 返回EAGAIN或者EWOULDBLOCK(注: EAGAIN就是EWOULDBLOCK)。这个错误表示资源暂时不够,能read时,读缓冲区没有数据,或者write时,写缓冲区满了。遇到这种情况,如果是阻塞socket,read/write就要阻塞掉。而如果是非阻塞socket,read/write立即返回-1, 同时errno设转载 2013-05-07 15:22:42 · 828 阅读 · 0 评论 -
setsockopt函数解析
setsockopt函数解析int setsockopt ( SOCKET s, int level, int optname, const char FAR * optval, int optlen );setsockopt原创 2013-05-24 15:25:42 · 1755 阅读 · 1 评论 -
struct sockaddr与struct sockaddr_in的区别和联系
最近在看网络编程部分内容,刚开始接触结构体struct sockaddr和struct sockaddr_in的时候,极其迷惑,在网上翻了不少帖子,慢慢有那么点清晰了。呵呵,现在结合一篇网友的文章,对这两个结构体进行解读。在linux环境下,结构体struct sockaddr在/usr/include/linux/socket.h中定义,具体如下:typedef unsigned s原创 2013-05-07 14:35:49 · 567 阅读 · 0 评论 -
socket shutdown和close的区别
socket关闭连接的方法有两种分别是shutdown和close。1)shutdown的定义:#includeint shutdown(int sockfd,int how);how的方式有三种分别是:SHUT_RD(0):关闭sockfd上的读功能,此选项将不允许sockfd进行读操作。SHUT_WR(1):关闭sockfd的写功能,此选项将不允许sockfd进行写操作。转载 2012-12-24 21:48:21 · 9920 阅读 · 2 评论 -
TCP/IP总结2:socket()浅析
socket()浅析 socket()是一个系统调用,它的入口是通过系统中一个sys_socketcall()系统调用形式入口的,sys_socketcall()先从用户空间获取数据存放在内核空间,然后根据命令功能调用各自具体的实现,socket()最终的系统调用就是sys_socket()。socket()的函数原型:int socket(int do原创 2012-07-22 12:00:58 · 1732 阅读 · 0 评论 -
linux网络通讯程序无提示自动退出——SIGPIPE信号退出
问题:最近写了一个网络通讯程序,在局域网内调试测试都没有出问题,但是一拿到真实环境就总是出错,异常自动退出最后根据strace发现,是因为sigpipe信号给结束掉的。关于sigpipe信号:产生原因:当服务器close一个连接时,若client端接着发数据。根据TCP协议的规定,会收到一个RST响应,client再往这个服务器发送数据时,系统会发出一个SIGP转载 2015-04-28 09:47:36 · 623 阅读 · 0 评论 -
非阻塞Socket连接处理
非阻塞套接字,connect不能立即完成就会返回错误,一般情况下会在系统提供的errno变量中返回一个EINRPOCESS错误,此时TCP的三路握手继续进行。那如何判断connnect的连接是否成功完成呢?从网络查看了很多相关文章,linux系统中没有对这个问题提供很好的处理方法,大多做法都是通过程序逻辑判断,逻辑过程如下:1.建立socket2.将该socket设置为非阻塞模式3.调原创 2009-06-01 08:36:00 · 4593 阅读 · 0 评论 -
TCP/IP总结1:阻塞socket和非阻塞socket
序:前段时间狂看了很多关于网络编程的资料,这里自己总结一下,以便自己以后可以参考。什么是阻塞socket,什么是非阻塞socket。对于这个问题,我们要先弄清什么是阻塞/非阻塞。阻塞与非阻塞是对一个文件描述符指定的文件或设备的两种工作方式。 阻塞的意思是指,当试图对该文件描述符进行读写时,如果当时没有东西可读或者暂时不可写,程序就进入等待状态,直到有东西可读或者可写为止。 非阻塞的意思是,原创 2012-07-21 12:27:24 · 27222 阅读 · 3 评论 -
select函数使用总结
阻塞方式block,就是进程或是线程执行到这些函数时必须等待某个事件的发生,如果事件没有发生,进程或线程就被阻塞,函数不能立即返回。使用Select就可以完成非阻塞non-block,就是进程或线程执行此函数时不必非要等待事件的发生,一旦执行肯定返回,以返回值的不同来反映函数的执行情况,如果事件发生则与阻塞方式相同,若事件没有发生则返回一个代码来告知事件未发生,而进程或线程继续执行,所以效率较高。原创 2013-05-07 14:25:47 · 633 阅读 · 0 评论 -
ipmsg学习笔记3—多线程1
Linux下的多线程遵循POSIX接口,称为pthread。需要pthread.h头文件。1、创建线程的函数int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict attr,void *(*start_rtn)(void), void *restrict arg);若成功则返回0,原创 2012-12-08 09:59:48 · 580 阅读 · 0 评论 -
ipmsg学习笔记1—系统用户信息
获取系统信息,用户信息,路径1)int uname(struct utsname *sysName);需要头文件sys/utsname.h,获取当前内核名称和其他信息,比如操作系统名,网络明等。 struct utsname { char sysname[_UTSNAME_SYSNAME_LENGTH];//当前操作系统名 char nodename[_UTSNAME_NO原创 2012-12-05 23:14:18 · 672 阅读 · 0 评论 -
exit,return,_exit3者的区别
1、exit(),作用是关闭所有文件,终止正在执行的程序,定义在stdlib.h中。 exit(1)表示异常退出.这个1是返回给操作系统的不过在DOS好像不需要这个返回值 exit(x)(x不为0)都表示异常退出 exit(0)表示正常退出 用 法: void exit(int status); 参 数 : status //程序退出的返回值. 2、re原创 2012-12-21 23:01:03 · 1279 阅读 · 0 评论 -
熟悉gcc编译器
在为Linux开发应用程序时,绝大多数情况下使用的都是C语言,因此几乎每一位Linux程序员面临的首要问题都是如何灵活运用C编译器。目前Linux下最常用的C语言编译器是GCC(GNU Compiler Collection),它是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C++和Object C等语言编写的程序。GCC不仅功能非常强大,结构也异常灵活。最值得称道的一点就是它可以通转载 2009-07-23 20:23:00 · 689 阅读 · 0 评论 -
Linux .o a .so .la .lo的区别
o: 编译的目标文件a: 静态库,其实就是把若干o文件打了个包so: 动态链接库(共享库)lo: 使用libtool编译出的目标文件,其实就是在o文件中添加了一些信息la: 使用libtool编译出的库文件,其实是个文本文件,记录同名动态库和静态库的相关信息 补充:libtool 1 libtool的工作原理 libtool 是一个通用库支持脚本,将使用动态库的复杂性隐藏在统一、可移植的接口中转载 2009-07-23 21:56:00 · 1781 阅读 · 0 评论 -
linux ipc—socket通信
一 创建socket服务端的流程如下:(1)创建socket,类型为AF_LOCAL或AF_UNIX,表示用于进程通信:int server_fd; int client_fd; struct sockaddr_un server_addr; struct sockaddr_un client_addr; size_t server_len,client_len;原创 2013-04-30 11:11:20 · 882 阅读 · 0 评论 -
ipmsg学习笔记2—信号量
信号量介绍(需要头文件#include )1、int sem_init(sem_t *sem, int pshared, unsigned int value);说明:sem_init() 初始化一个定位在 sem 的匿名信号量。value 参数指定信号量的初始值;pshared 参数指明信号量是由进程内线程共享,还是由进程之间共享,如果 pshared 的值为 0,那么信号量将被进程原创 2012-12-06 00:04:03 · 645 阅读 · 0 评论 -
ipmsg学习笔记3—多线程2
Linux下的多线程遵循POSIX接口,称为pthread。需要pthread.h头文件。3、线程的状态在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached)。一个可结合的线程能够被其他线程收回其资源和杀死;在被其他线程回收之前,它的存储器资源(如栈)是不释放的。相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。原创 2012-12-08 10:01:27 · 497 阅读 · 0 评论 -
僵尸进程和守护进程
1、僵尸进程僵尸进程,即一个进程使用fork创建子进程,如果子进程在退出时,父进程没有使用wait或waitpid函数获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中,这种进程就叫僵尸进程,通过ps命令可以看到很多状态为defunct的进程,这些就是僵尸进程。但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程。因为每个进程结束的时候,系统都会扫描当前系统中所运行的原创 2013-05-10 14:23:08 · 706 阅读 · 0 评论 -
运用Autoconf和Automake生成Makefile的学习之路
一、 相关概念的介绍什么是Makefile?怎么书写Makefile?竟然有工具可以自动生成Makefile?怎么生成啊?开始的时候,我有这么多疑问,所以,必须得先把基本的概念搞个清楚。 1. Makefile makefile用来定义整个工程的编译规则。一个工程中的源文件计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指转载 2013-01-05 21:46:50 · 686 阅读 · 1 评论 -
linux ipc—FIFO
#include #include #include #include #include #include #include #define MAX 1024#define FIFO_SERV "/home/ipc/fifo_serv"int main(int argc, char* argv[]){ pid_t pid; int prfd, pwfd; int原创 2013-05-10 15:32:45 · 722 阅读 · 0 评论 -
linux ipc—管道
#include #include #include #include #define MAX 1024int main(int argc, char* argv[]){ int pipefd[2], recvBytes, sendBytes; pid_t pid; char sendBuf[MAX], recvBuf[MAX]; memset(sendBuf, 0,原创 2013-05-09 16:16:15 · 577 阅读 · 0 评论 -
ipmsg学习笔记4—信号量和互斥量2
转载:http://blog.csdn.net/ray1944/article/details/4057902关键字:PTHREAD_MUTEX_INITIALIZER, pthread摘要:关于posix的互斥锁的使用由于semaphore功能强大,对于一些较简单的应用,posix定义了专门用于线程同步的mutex函数。1、创建和销毁有两种方式:静态和动态静态:pthre转载 2012-12-19 22:22:10 · 749 阅读 · 0 评论 -
ipmsg学习笔记4—信号量和互斥锁1
信号量和互斥锁的区别信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在sem_wait的时候,就阻塞在那里)。而互斥锁是用在多线程多任务互斥的,一个线程占用了某一个资源,那么别的线程就无法访问,直到这个线程unlock,其他的线程才开始可以利用这个资源。比如对全局变量的访问,有时要加锁,操作完了再解锁。有的时候锁和信号量会同时使用的原创 2012-12-12 23:47:38 · 742 阅读 · 1 评论 -
Linux下后台守护进程的编写实例
转载:http://zhoulifa.bokee.com/4627106.htmlLinux下后台守护进程的编写实例关键词:Linux 守护 后台 daemon 进程 相信随着Linux的普及,大家都在写不少Linux下的程序了,尤其是一些服务端程序慢慢地都转到Linux下了吧。大家必然碰到问题是如何让自己的进程成为守护进程,在系统启动的时候转载 2012-12-08 10:36:09 · 1446 阅读 · 0 评论 -
linux 守护进程
守护进程的初始化函数void InitDeamon(){ int childpid, fd, fdtablesize; int fp; signal(SIGTTOU, SIG_IGN); signal(SIGTTIN, SIG_IGN); signal(SIGTSTP, SIG_IGN); signal(SIGHUP, SIG_IGN); if (fork() != 0)原创 2015-04-28 16:51:10 · 655 阅读 · 0 评论 -
类的初始化列表与构造函数的区别
类的成员数据可以再构造函数的初始化列表中赋值,也可以再构造函数的函数体里面赋值,那么这两种有什么样的区别呢? 1 一般情况下,这两种没有什么区别;2 当类成员是没有默认构造函数的对象时,必须使用初始化列表进行赋值;3 当类成员是const成员或引用成员时,也必须使用初始化列表进行赋值;4 使用初始化列表提高了效率,当在类的构造函数对对象进行赋值时,需要一个默认构造函数+一个拷贝原创 2009-05-09 22:02:00 · 890 阅读 · 0 评论 -
linux ipc—信号
#include #include #include #include #include #include #include void op(int signum, siginfo_t* info, void* myact){ printf("the int value is %d\n", info->si_int);}int main(int argc, char*原创 2013-05-13 10:51:19 · 657 阅读 · 0 评论 -
Linux Unicode 编程
转载:http://blog.chinaunix.net/uid-8735300-id-2016833.htmlLinux Unicode 编程作为一个计算机的多位字符表示系统,Unicode 支持世界上所有语言的编码和转换。这篇文章说明了 Linux 应用程序中的国际语言支持的重要性,以及规划 Unicode 支持并将之结合到 Linux 应用程序中去的思想。Unic转载 2012-12-05 23:26:42 · 462 阅读 · 0 评论 -
STL删除元素要注意的地方
删除STL容器的元素时会导致迭代器失效,(关联容器和顺序容器的erase方法的返回值是不同的,关联容器一般没有返回值;顺序容器有返回值,它返回的是下一个元素的迭代器) 现在 下面的这个操作你看出问题了吗? .//删除其中的奇数 for(vector::iterator ite = v3.begin(); ite != v3.e原创 2012-07-12 23:25:00 · 828 阅读 · 0 评论 -
C 面试题之找错题
找错题 试题1:void test1(){ char string[10]; char* str1 = "0123456789"; strcpy( string, str1 );} 试题2:void test2(){ char string[10], str1[10]; int i; for转载 2009-07-15 21:34:00 · 2396 阅读 · 5 评论 -
成员函数后面的const
Class A{public:A():a(0), b(0) {}int FuncA();int FuncB() const;private:int a;int b;};成员函数声明后带一个const标示符说明该函数是const成员函数,而且只能被const对象调用。那这样写为什么就只能是const对象才能调用呢?呵呵,我想大家原创 2012-07-09 23:01:32 · 712 阅读 · 0 评论 -
const不为人关注的几面,^_^
const变量大家都知道必须在定义的时候初始化,而且后面不能在改变它的值。但是它还有不为人知的几面哦,现在让我告诉大家吧,呵呵~~~~ 1、非const变量默认是extern的,要使const变量能在其他文件中访问,必须显示的指定它为extern。 问大家一个问题:若在c1.cpp中定义了一个全局的const变量,在c2.cpp中是否可以使用该变原创 2012-07-08 16:37:50 · 403 阅读 · 0 评论 -
sizeof 类
1.class K{ };sizeof(K) = 1; 2. class A{ int a; void a();};sizeof(A) = 4; 3. class B{ int b; virtual void b(); } sizeof(B) = 4+4; 4. class C:virtual public原创 2009-06-12 18:29:00 · 1449 阅读 · 2 评论 -
const 用法总结c++
一、关于一般常量声明或定义的格式如下:const = ; [1] const = ; [2][1]和[2]的定义是完全等价的。 例如:整形int(或其他内置类型:float,double,char)const int bufSize = 512; 或者int const bufSize = 512; 因为常量在定义后就不能被修改,所以定义时必须转载 2009-07-21 17:15:00 · 671 阅读 · 0 评论 -
虚基类、抽象类
虚基类1 表示方式:class A { public: A() { cout } ~A() { cout } private: // add the code in here原创 2009-05-08 09:27:00 · 2747 阅读 · 0 评论 -
const 在c和c++中的区别
C++中的const正常情况下是看成编译期的常量,编译器并不为const分配空间,只是在编译的时候将期值保存在名字表中,并在适当的时候折合在代码中.所以,以下代码:#include using namespace std;int main(){const int a = 1;const int b = 2;int array[ a + b ] = {0};for (int i = 0; i {co转载 2009-07-21 17:05:00 · 676 阅读 · 0 评论 -
重载、覆盖、隐藏
重载:在同一可访问区内被声名的几个具有不同参数列的(参数的类型、个数、顺序不同)同名函数,程序会根据不同的参数列来确定具体调用哪个函数,这种机制叫重载,重载不关心函数的返回值类型。 覆盖:覆盖是指派生类中存在重新定义的函数,其函数名、参数列、返回值类型必须同父类中的相对应被覆盖的函数严格一致,覆盖函数和被覆盖函数只有函数体(花括号中的部分)不同,当派生类对象调用子类中该同名函数时会原创 2009-07-14 15:41:00 · 598 阅读 · 0 评论 -
if、assert区别
1 assert函数只在debug模式下起作用,在release模式下不起作用 2 if的判断用于与客户直接打交道的函数层,比如打开一个用户指定的文件,你首先要判断该字符串是否为空,这时用if 3 而assert一般用于你的底层函数层,此类参数错误一般是由于上层函数的错误而导致的,比如你打开一个文件,读出里面的内容并加密显示出来,在你的加密函数里,也就是你的底层函数里,ASSERT原创 2009-07-14 16:34:00 · 1568 阅读 · 0 评论 -
extern “C”含义
这个问题,在企业面试中会被经常问道:为什么标准头文件都有类似以下的结构? #ifndef __INCvxWorksh#define __INCvxWorksh #ifdef __cplusplusextern "C" {#endif /*...*/ #ifdef __cplusplus}#endif #endif /* __INCvxWorksh */ 下面我来简单解释一下这个题目中的原创 2009-04-23 21:11:00 · 652 阅读 · 0 评论 -
拷贝构造函数和重载"="赋值操作符
首先什么时候,需要用到这两个概念呢,他们解决一个什么问题呢?当一个类的对象拥有资源,比如动态分配的内存,当执行了使用已有对象初始化一个新的对象,或者用一个已有对象赋值另外一个已有对象。这个时候就会要考虑使用这两个概念了。 下面是一个例子类:class Internet { public: Internet(char *name,char *原创 2009-04-20 16:29:00 · 782 阅读 · 0 评论