Linux后台服务器编程。
发布时间:2014-07-06 18:26:49
linux上进程有5种状态: 1. 运行(正在运行或在运行队列中等待) 2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号) 3. 不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生) 4. 僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放) 5. 停止(进程.........【阅读全文】
发布时间: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 .........【阅读全文】
发布时间:2014-07-05 20:30:45
近来连续看到这样两个信息,一个是知乎上有个问题叫:“如何学习C语言?”,这个问题的答案中得票数第二高的是不要最先学习C语言;一个是看到了2012年金旭亮老师写的第一门编程语言选谁?这文章,金老师也是支持不用C做第一门语言的,从投票来看大部分人也比较支持这个观点。这是比较让我意外的事情,因为我正好持相.........【阅读全文】
发布时间:2014-07-05 17:39:43
使用信号和管道传递消息存在一定的限制:信号传递的消息有限,管道虽然可以传输一定量的信息,但是只能传递无格式的字节流。3种新的进程间通信(IPC)机制---消息队列、信号量、共享内存,可以解决这些问题。这些机制最早出现在UNIX中,被编入POSIC:XSI中,Linux支持POSIX标准。 (1)关于IPC资源消息队.........【阅读全文】
发布时间:2014-07-04 10:49:33
一、inode是什么理解inode,要从文件储存说起。文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是.........【阅读全文】
发布时间:2014-07-03 22:45:51
linux系统中每个进程都有2个ID,分别为用户ID和有效用户ID,UID一般表示进程的创建者(属于哪个用户创建),而EUID表示进程对于文件和资源的访问权限(具备等同于哪个用户的权限)。可以通过函数getuid()和geteuid()或者进程的两个ID值。 当一个用户登陆系统时,系统会将UID和EUID都赋值为/etc/passwd文件.........【阅读全文】
发布时间: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等函数则.........【阅读全文】
发布时间:2014-07-03 21:55:07
在Linux中,进程是通过文件描述符(file descriptors,简称fd)而不是文件名来访问文件的,文件描述符实际上是一个整数。Linux中规定每个进程能最多能同时使用NR_OPEN个文件描述符,这个值在fs.h中定义,为1024*1024(2.0版中仅定义为256)。每个文件都有一个32位的数字来表示下一个读写的字节位置,这个数字叫做文件.........【阅读全文】
发布时间:2014-07-03 16:34:00
一、fcntl函数int fcntl(int fildes, int cmd, .../*int arg*/);1.fcntl函数可以改变已经打开的文件性质。 2.主要功能:a.复制一个现有的描述符F_DUPFD:新文件描述符作为函数值返回,大于或者等于第三个参数。新描述符与filedes共享一个文件表项。但是新描述符有自己的文件描述符标志。其.........【阅读全文】
发布时间: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......【阅读全文】
发布时间:2014-07-02 17:59:03
一、下列四个条件中的任何一个满足时,socket准备好读: 1.socket接收缓冲区中已经接收的数据的字节数大于等于socket接收缓冲区低潮限度的当前值;对这样的socket的读操作不会阻塞,并返回一个大于0的值(即:准备好读入的数据的字节数).我们可以用socket选项SO_RCVLOWAT来设置此低潮限度,对于TCP和UDPsocket,其缺省值为1.........【阅读全文】
发布时间:2014-07-02 16:43:25
Linux后台开发应该具备技能一、linux和os:1、命令:netstat tcpdump ipcs ipcrm 这四个命令的熟练掌握程度基本上能体现实际开发和调试程序的经验2、cpu 内存 硬盘 等等与系统性能调试相关的命令必须熟练掌握,设置修改权限 tcp网络状态查看 各进程状态 抓包相关等相关命令 必须熟练掌握3、awk sed.........【阅读全文】
发布时间:2014-06-09 20:33:13
结合阻塞与非阻塞访问、poll 函数可以较好地解决设备的读写,但是如果有了异步通知就更方便了。异步通知的意思是:一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,这一点非常类似于硬件上“中断”地概念,比较准确的称谓是:信号驱动(SIGIO)的异步 I/O。可以使用signal()函数来设置对应的信号.........【阅读全文】
发布时间:2014-06-09 17:17:07
同步IO与异步IO的区别 首先要明确一点:不同IO模型之间的差别本质上是CPU的参与方式 这里重点说一下各自的应用场景 如何选择同步还是异步呢? 主要有这么几个指标供参考 1.并发数量 2.接收字节数 3.处理请求所需CPU时间 我们一个一个来考察 并发数 并.........【阅读全文】
发布时间:2014-06-09 17:04:44
AIO关于AIO的讨论,可以参看这个帖子 http://bbs.chinaunix.net/thread-4064773-1-1.html......【阅读全文】
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;
^
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};