Linux后台服务器编程。
发布时间:2014-07-09 16:52:25
【守护进程介绍】Linux系统启动时往往要启动很多的系统服务程序,比如apache,ftp,telnet等。这些系统服务程序往往运行在后台,没有控制终端,在系统引导装入时启动,在系统关闭时终止,周期性的执行某项任务或者等待处理某项任务。这样的进程叫守护进程或者精灵进程。 编写守护进程一般是在普通进程基.........【阅读全文】
发布时间:2014-07-09 11:58:47
SIGHUP信号与控制终端UNIX中进程组织结构为 session (会话)包含一个前台进程组及一个或多个后台进程组,一个进程组包含多个进程。一个session可能会有一个session首进程,而一个session首进程可能会有一个控制终端。一个进程组可能会有一个进程组首进程。进程组首进程的进程ID与该进程组ID相等。这儿是可.........【阅读全文】
发布时间:2014-07-08 12:26:42
【waitpid()介绍】waitpid主要用于根据进程ID号等待指定的子进程。函数形式如下:******************************************************pid_t waitpid(pid_t pid, int* status,int options);******************************************************关于options:---WNOHANG:如果没有子进程执.........【阅读全文】
发布时间:2014-07-08 12:25:12
(1)wait()wait函数用于父进程和子进程的同步,让父进程等待子进程结束。wait函数不需要带任何参数,适合于等待所有的子进程。相关信息如下:pid_t wait(int* status);如果函数执行成功,返回等待到结束的子进程的PID和结束状态status,否则返回-1.状态status有2种情况:一种是正常的退出,另一种是接受.........【阅读全文】
发布时间:2014-07-08 11:55:19
(1)fork和vfork之前用过fork来创建子进程,知道可以根据返回值来区分父子进程,对于父进程来说,fork的返回值是子进程ID,对于子进程来说返回PID为0.关于这一点,vfork函数与fork函数是相同的。而fork与vfork的区别在于在哪呢?*****************************************************************************.........【阅读全文】
发布时间:2014-07-07 23:31:44
前面三篇博文我们分别回顾了冒泡排序、选择排序、插入排序、希尔排序、归并排序、堆排序和快速排序。关于排序算法有几种分类标准,稳定与非稳定、内部与外部。 所谓稳定的排序算法,意思是如果待排序序列有相同元素,经过排序算法处理后他们的相对顺序和排序前在序列里的相对顺序一样,这样我.........【阅读全文】
发布时间:2014-07-07 23:31:28
这是排序算法的最后一篇了,剩下归并排序、堆排序和快速排序了,关于各种排序算法的效率、适用场合和性能的分析留到下一篇再讲。归并排序 归并排序是基于归并操作的,归并操作的思想很简单,针对两个已经排好序的有序序列: 1、申请一块额外的存储空间,空间的大小等于两个待操.........【阅读全文】
发布时间:2014-07-07 23:31:11
上一篇我们回顾了选择和冒泡排序、以及改进的冒泡排序两种算法,今天我们来看一下插入排序和希尔排序。插入排序 插入排序的本质是将待排序序列分成有序和无序两部分,通常情况下我们都认为序列的第一元素是有序的,所以插入排序一般是从序列的第二个元素(下标是1的位置)开始。插入排序.........【阅读全文】
发布时间:2014-07-07 23:30:45
除了刚迈出校门找工作那会儿对基本排序算法还算“了然于心”,随着工作和时间的推移,当回头再来看这些基础的不能再基础的东西时,绝大多数人无法写出经典排序算法的核心代码,甚至连算法原理都忘了。我承认,自己就是这样的人,所以今天有空将常见的几种排序算法复习一下,写个笔记。一方面给自己一个“重新.........【阅读全文】
发布时间:2014-07-07 23:24:09
stevenrao 深圳写于2012 年 情人节。献给天下有情码农; 在Linux 开发中,有几个关系到性能的东西,技术人员非常关注:进程,CPU,MEM,网络IO,磁盘IO。本篇文件打算详细全面,深入浅出。......【阅读全文】
发布时间:2014-07-07 23:20:52
B-树是一种平衡的多路查找树,它在文件系统中很有用。 定义:一棵m 阶的B-树,或者为空树,或为满足下列特性的m 叉树: ⑴树中每个结点至多有m 棵子树; ⑵若根结点不是叶子结点,则至少有两棵子树;......【阅读全文】
发布时间:2014-07-07 23:07:50
tcpdump [功能] 抓包工具。 [描述] 1、简介 tcpdump,就是:dump the traffice on a network,是Linux上的网络数据采集分析工具(即sniffer), 可以根据使用者的定义对网络上的数据包进行截获的包分析工具。sniffer工具首先是为网络管理员和网络.........【阅读全文】
发布时间:2014-07-07 22:38:07
之前有介绍过关于文件的指针和描述符,这次通过一个练习,熟悉了一下文件的open,close,read,write,sleek,dup等操作,一些主要的注意事项详见代码注释吧。 ps:部分代码写的有些龌龊,也和硬要把几个函数都试到有关,应该可以用更好的方法。fighting~~~ 【功能】命令行输入三个参数,将data.dat.........【阅读全文】
发布时间:2014-07-07 20:42:40
【代码】file.c#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>#include <fcntl.h>int main(int argc,char* argv[]){ struct stat file_stat; int fd; if(2 != argc) &nbs.........【阅读全文】
发布时间:2014-07-07 17:49:51
从 socket 到设备驱动程序Linux? 操作系统的最大特性之一就是它的网络栈。它最初源于 BSD 的网络栈,具有一套非常干净的接口,组织得非常好。其接口范围从协议无关层(例如通用 socket 层接口或设备层)到各种网络协议的具体层。本文将从分层角度对 Linux 网络栈的接口进行探索,并介绍其中的一些主要结构。协议简.........【阅读全文】
发布时间:2014-07-07 16:57:35
Linux? 系统调用 —— 我们每天都在使用它们。不过您清楚系统调用是如何在用户空间和内核之间执行的吗?本文将探究 Linux 系统调用接口(SCI)系统调用就是用户空间应用程序和内核提供的服务之间的一个接口。由于服务是在内核中提供的,因此无法执行直接调用;相反,您必须使用一个进程来跨越用户空间与内核之间的界限。.........【阅读全文】
发布时间:2014-07-06 21:08:37
最近工作过程中,发现好几台服务器出现僵死进程(如图)。 用下面的命令找出僵死进程 ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]' 命令注解: -A 参数列出所有进程 -o 自定义输出字段 我们设定显示字段为 stat(状态), ppid(进程父id), pid(进程id),cmd(命令)这四个参数.........【阅读全文】
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};