Chinaunix首页 | 论坛 | 博客
  • 博客访问: 910649
  • 博文数量: 299
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2493
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-21 10:07
个人简介

Linux后台服务器编程。

文章分类

全部博文(299)

文章存档

2015年(2)

2014年(297)

发布时间:2014-08-18 16:25:56

8  高性能服务器程序框架服务器解构为三个主要模块:IO处理单元。四种IO模型和两种高效事件处理模式。逻辑单元。两种高效并发模式。存储单元。(暂不讨论)IO模型:阻塞IO非阻塞IOIO复用//程序阻塞于IO复用系统调用,但可同时监听多个IO事件。SIGIO信号//信号触发读写就绪事件,用户程序执行读写操作,程.........【阅读全文】

阅读(6008) | 评论(0) | 转发(3)

发布时间:2014-08-29 15:53:07

回车符号和换行符号产生背景 关于“回车”(carriage return)和“换行”(line feed)这两个概念的来历和区别。在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒.........【阅读全文】

阅读(1883) | 评论(0) | 转发(0)

发布时间:2014-08-27 16:36:56

在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用。所以在所有对象中都可以共享它。使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存。静态成员的定义或声明要加个关键static。静态成员可以通过双冒号来使用即<类名>::<静态成员名>。.........【阅读全文】

阅读(1448) | 评论(0) | 转发(0)

发布时间:2014-08-25 11:56:08

Linux下tcp连接断开的时候调用close()函数,有优雅断开和强制断开两种方式。那么如何设置断开连接的方式呢?是通过设置socket描述符一个linger结构体属性。linger结构体数据结构如下: #include <arpa/inet.h> struct linger {   int l_onoff;   int l_linger;}; 三种断开方式:1..........【阅读全文】

阅读(1625) | 评论(0) | 转发(0)

发布时间:2014-08-24 19:39:06

TIME_WAIT状态的作用  主动关闭的Socket端会进入TIME_WAIT状态,并且持续2MSL时间长度,MSL就是maximum segment lifetime(最大分节生命期),这是一个IP数据包能在互联网上生存的最长时间,超过这个时间将在网络中消失。MSL在RFC 1122上建议是2分钟,而源自berkeley的TCP实现传统上使用30秒,因而,TIME_W.........【阅读全文】

阅读(1746) | 评论(0) | 转发(0)

发布时间:2014-08-22 21:22:58

总结一:先看一个空的类占多少空间? [cpp] view plaincopyclass Base  {  public:      Base();      ~Base();  .........【阅读全文】

阅读(2390) | 评论(0) | 转发(0)

发布时间:2014-08-19 18:35:38

5  Linux网络编程基础API1、socket地址API。2、socket基础API。主要定义在sys/socket.h头文件中,包括创建socket、命名socket、监听socket、接收连接、发起连接、读写数据、获取地址信息、检测带外标记,以及读取和设置socket选项。3、网络信息API。Linux提供了一套网络信息API,实现主机名和ip地址之间的转换.........【阅读全文】

阅读(2550) | 评论(0) | 转发(3)

发布时间:2014-08-18 23:52:37

6  高级IO函数:用于创建文件描述符:pipe、dum/dup2用于读写数据:readv/writev、sendfile、mmap/munmap、splice、tee用于控制IO行为和属性:fcntl管道:#include <unistd.h>int pipe(int fd[2]);默认情况下这对文件描述符都是阻塞的。如果用read调用读取一个空管道,read将会阻塞直到有数据可读为止;write.........【阅读全文】

阅读(2603) | 评论(0) | 转发(0)

发布时间:2014-08-18 20:36:01

7  Linux服务器程序规范1、一般以后台程序运行。(daemon)没有控制终端,因而不会意外接收到用户输入。父进程通常为init.2、通常有一套日志系统,至少能输出日志到文件,有的高级服务器能输出到专门的udp服务器。大部分后台程序都在/var/log目录下有自己的日志目录。3、一般以某个专门的非root身份运行。如mysq.........【阅读全文】

阅读(2261) | 评论(0) | 转发(0)

发布时间:2014-08-18 00:04:22

9  IO复用#include <sys/select.h>int select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, struct timeval* timeout);nfds指定被监听的文件描述符的总数。通常是select监听的所有文件描述符的最大值加1,因为文件描述符从0开始计数。#include <typesizes.h>#define __FD_SETSIZE 1024.........【阅读全文】

阅读(2097) | 评论(0) | 转发(0)

发布时间:2014-08-17 20:27:37

10信号#include #include int kill(pid_t pid, int sig);pid>0pid=0//信号发送给本进程组内的其他进程pid=-1//发送给除init之外的所有进程,但发送者要拥有对目标进程发送信号的权限pid......【阅读全文】

阅读(1840) | 评论(0) | 转发(0)

发布时间:2014-08-17 19:35:07

14 多线程编程创建线程和结束线程#include int pthread_create(pthread_t* thread, const pthread_attr_* attr, void* (*start_routine)(void*), void* arg);pthread_t是一个整形数,Linux上几乎所有的资源标示符都是一个整形数,比如socket、各种ipc标示符等。int pthread_exit(void* retval);一个进.........【阅读全文】

阅读(1533) | 评论(0) | 转发(0)

发布时间:2014-08-17 15:37:47

Linux高性能服务器编程13多进程编程#include #include pid_t fork(void);子进程的代码和父进程完全相同,同时它还会复制父进程的数据(堆栈数据和静态数据),数据的复制采用写时复制(copy on write);父进程打开的文件描述符在子进程中也打开,且文件描述符引用计数加1.且父进程的.........【阅读全文】

阅读(1347) | 评论(0) | 转发(0)

发布时间:2014-08-17 11:35:51

inux 多线程信号总结(一)  1. 在多线程环境下,产生的信号是传递给整个进程的,一般而言,所有线程都有机会收到这个信号,进程在收到信号的的线程上下文执行信号处理函数,具体是哪个线程执行的难以获知。  2 signal函数BSD/Linux的实现并不在信号处理函数调用时,恢复信号的处理为默认,而是在信号处理时阻塞.........【阅读全文】

阅读(1444) | 评论(0) | 转发(0)

发布时间:2014-08-16 14:25:38

当一个进程调用fork时,因为子进程在开始时复制父进程的存储映像,信号捕捉函数的地址在子进程中是有意义的,所以子进程继承父进程的信号处理方式。特殊的是exec,因为exec运行新的程序后会覆盖从父进程继承来的存储映像,那么信号捕捉函数在新程序中已无意义,所以exec会将原先设置为要捕捉的信号都更改为默认动作。1.........【阅读全文】

阅读(4860) | 评论(1) | 转发(0)

发布时间:2014-08-16 11:53:47

※unix域套接字实际上不是一个实际的协议,他只是在同一台主机上客户和服务器之间通信时,使用与在不同主机上客户和服务器间通信时相同的API   unix域套接字分为两种:字节流套接字和数据报套接字unix域套接字的好处:1 在同一台主机上进行通信时,是不同主机间通信的两倍2 unix域套.........【阅读全文】

阅读(1296) | 评论(0) | 转发(0)

发布时间:2014-08-13 16:59:05

http://www.enterprisenetworkingplanet.com/netos/article.php/3442341I confess, I'm an outlaw at heart. I like using packet sniffers like tcpdump because it satisfies my base snooping impulses. Packet-sniffing is wiretapping after all, only it's applied to TCP/IP packets, not voice tr.........【阅读全文】

阅读(1721) | 评论(0) | 转发(0)

发布时间:2014-08-10 15:57:37

 什么是类型安全?类型安全很大程度上可以等价于内存安全,类型安全的代码不会试图访问自己没被授权的内存区域。“类型安全”常被用来形容编程语言,其根据在于该门编程语言是否提供保障类型安全的机制;有的时候也用“类型安全”形容某个程序,判别的标准在于该程序是否隐含类型错误。类型安全的编程语言与类型.........【阅读全文】

阅读(1076) | 评论(0) | 转发(0)

发布时间:2014-08-10 10:32:13

JAVA和C++都是面向对象语言。也就是说,它们都能够实现面向对象思想(封装,继乘,多态)。而由于c++为了照顾大量的C语言使用者, 而兼容了C,使得自身仅仅成为了带类的C语言,多多少少影响了其面向对象的彻底性!JAVA则是完全的面向对象语言,它句法更清晰,规模更小,更易学。它是在对多种程序设计语言进行了深.........【阅读全文】

阅读(1277) | 评论(0) | 转发(0)

发布时间:2014-08-10 09:55:06

构建现代的服务器应用程序需要以某种方法同时接收数百、数千甚至数万个事件,无论它们是内部请求还是网络连接,都要有效地处理它们的操作。有许多解决方案,但是 libevent 库和 libev 库能够大大提高性能和事件处理能力。在本文中,我们要讨论在 UNIX? 应用程序中使用和部署这些解决方案所用的基本结构和方法。libev 和 li.........【阅读全文】

阅读(1606) | 评论(0) | 转发(0)

发布时间:2014-08-08 09:31:13

最近研究了一下elf文件格式,发现好多资料写的都比较繁琐,可能会严重打击学习者的热情,我把自己研究的结果和大家分享,希望我的描述能够简洁一些。一、基础知识     elf是一种文件格式,用于存储Linux程序. 它内部都有一些什么信息呢?大概包括编制好的计算机指令,数据,计算机在需要的时.........【阅读全文】

阅读(2263) | 评论(0) | 转发(0)

发布时间:2014-08-07 17:38:53

   volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。下面举例说明。在DSP.........【阅读全文】

阅读(1206) | 评论(0) | 转发(0)

发布时间:2014-08-07 11:41:33

近来网站随着访问量的增加,服务器的压力也随之上升,一个很明显的状况便是服务端产生了大量的TIME_WAIT状态,它究竟是什么、对系统有何影响、为什么很多人对它如此敏感? Google一下TIME_WAIT会有成千上万的文章,但总是别人的,今天自己整理一下对TIME_WAIT的认识。 TCP连接的终止 TCP建立一个连接.........【阅读全文】

阅读(1537) | 评论(0) | 转发(0)

发布时间:2014-08-07 10:59:00

 这个图n多人都知道,它对排除和定位网络或系统故障时大有帮助,但是怎样牢牢地将这张图刻在脑中呢?那么你就一定要对这张图的每一个状态,及转换的过程有深刻地认识,不能只停留在一知半解之中。下面对这张图的11种状态详细解释一下,以便加强记忆!不过在这之前,先回顾一下TCP建立连接的三次握手过程,.........【阅读全文】

阅读(1343) | 评论(0) | 转发(0)

发布时间:2014-08-06 17:09:45

C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。面向过程的static静态全局变量在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。我们先举一个静态全局变量的例子,如下://Example.........【阅读全文】

阅读(951) | 评论(1) | 转发(0)
给主人留下些什么吧!~~

tianyashuibin2014-12-08 11:22

Oscarzhao:c++11 中貌似可以

嗯,是的,在c++11中可以

下面是在gcc的编译结果:
test_struct.cc:8:11: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default]
   int a = 1;
           ^

回复  |  举报

Oscarzhao2014-11-26 20:12

tianyashuibin:除了静态数据成员外,数据成员不能在类体内显式的初始化

举个最简单例子
struct a

  int a=1;
  int b=2;
};
这也不能通过啊!
原因很简单,因为struct a此时只是在说明有这么个类型,而并没有定义一个具体的变量和分配内存空间

c++11 中貌似可以

回复  |  举报

tianyashuibin2014-10-23 21:57

除了静态数据成员外,数据成员不能在类体内显式的初始化

举个最简单例子
struct a

  int a=1;
  int b=2;
};
这也不能通过啊!
原因很简单,因为struct a此时只是在说明有这么个类型,而并没有定义一个具体的变量和分配内存空间

回复  |  举报

tianyashuibin2014-10-23 21:39

1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员
2.进入构造函数后在构造函数中执行一般计算
  1.类里面的任何成员变量在定义时是不能初始化的。
  2.一般的数据成员可以在构造函数中初始化。
  3.const数据成员必须在构造函数的初始化列表中初始化。
  4.static要在类的定义外面初始化。   
  5.数组成员是不能在初始化列表里初始化的。
  6.不能给数组指定明显的初始化。  
这6条一起,说明了一个问题:C++里面是不能定义常量数组的!因为3和5的矛盾。

回复  |  举报

tianyashuibin2014-10-23 21:32

记住静态成员这样初始化:
C/C++ code

class A
{
public:
   static const int a[3];
};
 
const int A::a[3] = {1,2,3};

回复  |  举报
留言热议
请登录后留言。

登录 注册