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

Linux后台服务器编程。

文章分类

全部博文(299)

文章存档

2015年(2)

2014年(297)

发布时间:2014-07-06 18:26:49

linux上进程有5种状态: 1. 运行(正在运行或在运行队列中等待) 2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号) 3. 不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生) 4. 僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放) 5. 停止(进程.........【阅读全文】

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

发布时间:2014-07-06 16:49:50

进程控制块的基本内容概述进程控制块(PCB)(系统为了管理进程设置的一个专门的数据结构,用它 来记录进程的外部特征,描述进程的运动变化过程。系统利用PCB来控制 和管理进程,所以PCB是系统感知进程存在的唯一标志。进程与PCB是一 一对应的)应用在不同的操作系统中对进程的控制和管理机制不同,PCB中的.........【阅读全文】

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

发布时间:2014-07-06 16:35:22

进程链代码中提到两种方式:都是要等到子进程终止后再终止父进程。如果父进程在子进程终止前终止,那么子进程就会被init进程接管,getppid()输出的就会使init进程的pid.......【阅读全文】

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

发布时间:2014-07-05 22:52:28

【命令功能】linux系统中ls -l命令可以获得某个目录下文件的具体信息,比如:gaolu@gaolu-desktop:~/test_folder$ ls -ltotal 20-rw-r--r-- 1 gaolu gaolu 2578 2009-03-08 02:10 gao.lu.c-rw-r--r-- 1 gaolu gaolu 2577 2009-03-08 02:07 gao.lu.c~-rwxr-xr-x 1 gaolu gaolu 9675 2009-03-08 02:12 .........【阅读全文】

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

发布时间:2014-07-05 20:30:45

近来连续看到这样两个信息,一个是知乎上有个问题叫:“如何学习C语言?”,这个问题的答案中得票数第二高的是不要最先学习C语言;一个是看到了2012年金旭亮老师写的第一门编程语言选谁?这文章,金老师也是支持不用C做第一门语言的,从投票来看大部分人也比较支持这个观点。这是比较让我意外的事情,因为我正好持相.........【阅读全文】

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

发布时间:2014-07-05 17:39:43

使用信号和管道传递消息存在一定的限制:信号传递的消息有限,管道虽然可以传输一定量的信息,但是只能传递无格式的字节流。3种新的进程间通信(IPC)机制---消息队列、信号量、共享内存,可以解决这些问题。这些机制最早出现在UNIX中,被编入POSIC:XSI中,Linux支持POSIX标准。 (1)关于IPC资源消息队.........【阅读全文】

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

发布时间:2014-07-04 16:37:20

每一个进程都有自己的一个进程堆栈空间。在Linux界面执行一个执行码时,Shell进程会fork一个子进程,再调用exec系统调用在子进程中执行该执行码。exec系统调用执行新程序时会把命令行参数和环境变量表传递给main函数,它们在整个进程堆栈空间中的位置如下图12-7所示。     .........【阅读全文】

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

发布时间:2014-07-04 10:49:33

一、inode是什么理解inode,要从文件储存说起。文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是.........【阅读全文】

阅读(1686) | 评论(1) | 转发(2)

发布时间:2014-07-03 22:45:51

linux系统中每个进程都有2个ID,分别为用户ID和有效用户ID,UID一般表示进程的创建者(属于哪个用户创建),而EUID表示进程对于文件和资源的访问权限(具备等同于哪个用户的权限)。可以通过函数getuid()和geteuid()或者进程的两个ID值。 当一个用户登陆系统时,系统会将UID和EUID都赋值为/etc/passwd文件.........【阅读全文】

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

发布时间:2014-07-03 22:23:55

在C程序中,文件由文件指针或者文件描述符表示。ISO C的标准I/0库函数(fopen, fclose, fread, fwrite, fscanf, fprintf等)使用文件指针,UNIX的I/O函数(open, close, read, write, ioctl)使用文件描述符。下面重点来说下,文件描述符是如何工作的。 文件描述符相当于一个逻辑句柄,而open,close等函数则.........【阅读全文】

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

发布时间:2014-07-03 21:55:07

在Linux中,进程是通过文件描述符(file descriptors,简称fd)而不是文件名来访问文件的,文件描述符实际上是一个整数。Linux中规定每个进程能最多能同时使用NR_OPEN个文件描述符,这个值在fs.h中定义,为1024*1024(2.0版中仅定义为256)。每个文件都有一个32位的数字来表示下一个读写的字节位置,这个数字叫做文件.........【阅读全文】

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

发布时间:2014-07-03 16:34:00

一、fcntl函数int fcntl(int fildes, int cmd, .../*int arg*/);1.fcntl函数可以改变已经打开的文件性质。 2.主要功能:a.复制一个现有的描述符F_DUPFD:新文件描述符作为函数值返回,大于或者等于第三个参数。新描述符与filedes共享一个文件表项。但是新描述符有自己的文件描述符标志。其.........【阅读全文】

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

发布时间:2014-07-03 11:10:05

通过 read write系统调用来反应socket编程中的出错情况;
每个socket都有两个缓冲区send buffer, receive buffer;
发送到网络的数据暂存在send buffer中,只有收到对方的ack后, kernel才从buffer中清除这部分数据;接收端将收到的数据暂存在receive buffer 中,自动进行确认。
服务器编程中常用的做法: 线程池 + Nonblock I/O + Multiplexing(select/poll, 以及linux上特有的epoll);
通过fcntl(fd, F_SETFL, flags | O_NONBLOCK); 来设置文件描述符为 noblock;
read在receive buffer有数据时立刻返回,当receive buffer为空时,blocking模式会等待,而nonblock模式下会立即返回-1(errno = EAGAIN 或 EWOULDBLOCK);
blocking的write只有在缓冲区足以放下整个buffer时才返回,nonblock write......【阅读全文】

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

发布时间:2014-07-02 17:59:03

一、下列四个条件中的任何一个满足时,socket准备好读: 1.socket接收缓冲区中已经接收的数据的字节数大于等于socket接收缓冲区低潮限度的当前值;对这样的socket的读操作不会阻塞,并返回一个大于0的值(即:准备好读入的数据的字节数).我们可以用socket选项SO_RCVLOWAT来设置此低潮限度,对于TCP和UDPsocket,其缺省值为1.........【阅读全文】

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

发布时间:2014-07-02 16:43:25

Linux后台开发应该具备技能一、linux和os:1、命令:netstat tcpdump ipcs ipcrm  这四个命令的熟练掌握程度基本上能体现实际开发和调试程序的经验2、cpu 内存 硬盘 等等与系统性能调试相关的命令必须熟练掌握,设置修改权限 tcp网络状态查看 各进程状态 抓包相关等相关命令 必须熟练掌握3、awk sed.........【阅读全文】

阅读(1460) | 评论(0) | 转发(2)

发布时间:2014-06-13 16:50:41

存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。在大型数据库系统中,存储过程和触.........【阅读全文】

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

发布时间:2014-06-12 22:07:24

数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不.........【阅读全文】

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

发布时间:2014-06-12 21:55:05

线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程.........【阅读全文】

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

发布时间:2014-06-09 20:33:13

结合阻塞与非阻塞访问、poll 函数可以较好地解决设备的读写,但是如果有了异步通知就更方便了。异步通知的意思是:一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,这一点非常类似于硬件上“中断”地概念,比较准确的称谓是:信号驱动(SIGIO)的异步 I/O。可以使用signal()函数来设置对应的信号.........【阅读全文】

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

发布时间:2014-06-09 17:17:07

同步IO与异步IO的区别 首先要明确一点:不同IO模型之间的差别本质上是CPU的参与方式 这里重点说一下各自的应用场景 如何选择同步还是异步呢? 主要有这么几个指标供参考 1.并发数量 2.接收字节数 3.处理请求所需CPU时间 我们一个一个来考察 并发数 并.........【阅读全文】

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

发布时间:2014-06-09 17:04:44

AIO关于AIO的讨论,可以参看这个帖子 http://bbs.chinaunix.net/thread-4064773-1-1.html......【阅读全文】

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

发布时间:2014-06-09 16:44:30

之前博客有一个俄罗斯方块(使用异步io实现), 这个相对简单......【阅读全文】

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

发布时间:2014-06-07 17:35:59

新疆 linux tcp MTU MSS 1448 ......【阅读全文】

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

发布时间:2014-06-07 17:19:43

新疆 linux send recv......【阅读全文】

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

发布时间:2014-06-07 15:41:12

新疆 linux IO调度 IO队列......【阅读全文】

阅读(1575) | 评论(0) | 转发(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};

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

登录 注册