Linux后台服务器编程。
发布时间:2014-07-12 10:21:17
【代码】申请一个共享内存区,attach到进程当中,然后通过fork创建子进程。理论上子进程和父进程是各自有在自己的内存空间,对变量的修改互不影响的,但是共享内存中的数据由子进程修改以后,父进程可以得知。#include <stdio.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/shm.h>extern in.........【阅读全文】
发布时间:2014-07-11 15:53:41
简单归纳:fd只是一个整数,在open时产生。起到一个索引的作用,进程通过PCB中的文件描述符表找到该fd所指向的文件指针filp。文件描述符的操作(如: open)返回的是一个文件描述符,内核会在每个进程空间中维护一个文件描述符表, 所有打开的文件都将通过此表中的文件描述符来引用; 而流(如: fopen)返回的是一个FIL.........【阅读全文】
发布时间:2014-07-10 20:50:03
7.1.1 Linux管道的实现机制在Linux中,管道是一种使用非常频繁的通信机制。从本质上说,管道也是一种文件,但它又和一般的文件有所不同,管道可以克服使用文件进行通信的两个问题,具体表现为:· 限制管道的大小。实际上,管道是一个固定大小的缓冲区。在Linux中,该缓.........【阅读全文】
发布时间:2014-07-10 15:54:42
文件锁、信号等进程通信方法无法实现在进程见传递大量数据,如果使用文件锁,进程见信息的传递将受到磁盘读取速度的限制。管道作为最早的进程间通信机制,实现了父子进程或者兄弟进程之间的数据读写。 Linux系统中的管道都是半双工的,所以要实现双工通信就需要创建2个管道来完成了;某些UNIX版本的管道是全.........【阅读全文】
发布时间:2014-07-10 15:32:41
在C语言编程中,当我们声明一个字符串数组的时候,常常需要把它初始化为空串。总结起来有以下三种方式:(1) char str[10]="";(2) char str[10]={'\0'};(3) char str[10]; str[0]='\0';第(1)(2)种方式是将str数组的所有元素都初始化为'\0',而第(3)种方式是只将str数组的第一个元素初始化为'\0'。如果数组.........【阅读全文】
发布时间:2014-07-10 12:18:17
信号是进程之间通信的另外一种方式。之前用过kill -l看了Linux系统支持的所有信号,这些信号在sys/signal.h中定义,系统支持64种信号。除了系统内核和root之外,只有具备相同uid、gid的进程才可以使用信号进行通信。gaolu@gaolu-desktop:~$1、信号的产生(1)kill函数函数调用形式为int kill(pid_t pid,i.........【阅读全文】
发布时间:2014-07-10 09:59:27
在Linux系统中,进程运行在自己的虚拟内存空间中,如何协调不同虚拟地址空间中的进程访问一个非共享资源,文件加锁是基本进程通信方法之一。 可以使用fcntl()、lockf()、flock()实现文件锁,进而实现进程之间的通信。 1.fcntl()【函数介绍】调用形式(执行失败返回-1):int fcntl.........【阅读全文】
发布时间:2014-07-09 17:54:06
【syslogd守护进程】由于守护进程没有控制终端进行信息的输出,而有些情况还需要根据进程提供的信息进行系统管理和维护工作。因此Linux提供了syslogd守护进程,专门用于接受其他守护进程提供的信息记录在指定位置来解决日志记录的问题。 1.syslogd守护进程负责记录、发送系统或者工具产生的信息,根.........【阅读全文】
发布时间: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工具首先是为网络管理员和网络.........【阅读全文】
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};