月份:2015年1月

Home / 月份:2015年1月

FIFO阻塞读写

2015-1-31 16:12:01 | Linux C | 没有评论

pipe一般都要和fork结合起来用,所以多进程都是基于一个主进程产生的,有一定的关联性,假如两个毫无相关的进程要进行进程间通信,命名管道可以实现;一个进程向FIFO写数据,另一个进程从FIFO读取数据

为了保持原子操作,可以通过阻塞方式来打开FIFO,就算只有一个读进程或者只有一个写进程存在,也会阻塞住等待对应的另一个进程的出现

打开FIFO的方式有下面几种:

open(const char *p[......]

Read more

True-Client-IP和X-Real-IP

2015-1-30 01:15:23 | HTTP | 没有评论

网络数据包千奇百怪,特别是7层HTTP信息,我膜拜一下,再一次重新读一遍这个全称Hypertext Transfer Protocol,超文本传输协议

一个真实的用户,通过了几层代理服务器的话,HTTP头部有可能会放一个X-Forwarded-For域,可以查到真实的IP,今天又碰到了另两个类似名字的域

True-Client-IP

根据这个域的名称,我觉得应该代表的就是用户的真实IP,假如经过了[……]

Read more

Linux下离线分析网络数据包2~7层信息脚本

2015-1-30 00:13:09 | Perl | 没有评论

两年前为了更好验证正确性,刚摸PERL,写的一个数据包分析脚本,整体还是比较弱的,缺少了perl的任性

这个脚本优点有:

1:基本能将wireshark的命令行程序tshark的所有用法都揽括在内了,再也不用担心不会命令了

2:离线能够分析链路层,IP层,TCP层以及HTTP层的相关信息,并以文件方式储存起来

3:由于输入是一个文件列表,所以可以一次性处理多个数据包文件,每个文件信息分开储存起来

[……]

Read more

在验证正确性的时候,时常要统计指定端口的流量,也就是frame length,这里是一个简单的PERL程序,将打印所有的端口流量,以及流量所占比例,可以在Linux系统下安装有tshark的环境下运行

#!/usr/bin/perl
##########################################
##input:
##  trace file list
##output:
##[......]

Read more

命名管道FIFO

2015-1-29 00:57:30 | Linux C | 没有评论

fork出来的进程通过普通管道pipe传递数据,而这些进程他们最先都是由一个主进程给构造出来的,也就是有相关性,而如果是想在完全不想关的进程之间传输数据,Linux下可以通过一种特殊的文件来完成,命名管道,它在文件系统中是以文件名的形式存在的

命令行创建命名管道:

[lihui@localhost ~]# mkfifo one
[lihui@localhost ~]# ll one
prw-r--r[......]

Read more

Memory Leak检测工具dmalloc

2015-1-28 23:59:17 | Testing | 没有评论

今天大家都在怀疑系统可能有memory leak,于是我准备用内存检测工具测试一把,valgrind由于还要修改的source code比较多,就下了3年前曾经用过的另一个工具dmalloc,由于用过,所以信心满满 ,可惜太失望了

1:下载,最新版也是几年前的

wget http://dmalloc.com/releases/dmalloc-5.5.2.tgz

2:安装

tar zxvf dmallo[......]

Read more

进程管道popen

2015-1-27 22:24:35 | Linux C | 没有评论

python里经常通过popen调用系统命令,并获取命令的输出结果,然后进行二次处理,是十分地简便,比如想查看下当前的Linux系统,直接调用shell命令很容易一行就能解决

#!/usr/bin/env python

import os

print os.popen('cat /etc/issue').read().strip()

[lihui@localhost ~]# ./popen.p[......]

Read more

pipe和fork

2015-1-27 17:30:45 | Linux C | 没有评论

管道看上去也就创造了两个文件描述符,能够读写,好像没能体现出应有的价值,但是假如是要进程间通信,传递数据的时候,只要管道打开的两个文件描述符存在,通过调用fork创建子进程,那么两个进程可以通过管道传递数据,才是真正有用的时候

调用pipe之后,接着调用fork,这样就创建了由主到子(或者子到主)的通道,但是fork之后进程做什么就决定了数据流的方向,下面的简单例子就是从子进程到主进程的方向

#in[......]

Read more

memset

2015-1-27 17:11:28 | Linux C | 没有评论

将buffer所指的内存区域的前count个字节用字符ch替换,对于较大的结构体或者数组清零是个不错的操作

#include <string.h>

void *memset(void *s, int ch, size_t count);

实际上作用就是在一段内存块中填充某个给定的值,比如下面小例子:

#include <stdio.h>
#include <string[......]

Read more

Linux文件缓冲区

2015-1-27 13:03:49 | Linux | 没有评论

标准库函数提供带缓冲区的文件操作,将会在用户空间中自动为正在使用的文件开辟内存缓冲区

对于全缓冲区,会塞满整个缓冲区再来进行IO系统调用操作,通常磁盘文件的操作都是全缓冲来访问,打印一下缓冲区大小

#include <stdio.h>

int main(){
    printf("%d\n", BUFSIZ);
    return 0;
}
[lihui@localhost ~]$[......]

Read more

管道

2015-1-27 00:20:14 | Linux C | 没有评论

通常将一个进程的输出通过管道连接到另一个进程的输入,linux下已经对shell命令里管道符号“|”太熟悉了,起到了命令连接的作用,比如命令

[lihui@localhost ~]# lspci | grep Network
0b:00.0 Ethernet controller: Intel Corporation 82599EB 10-Gigabit SFI/SFP+ Network Conne[......]

Read more

Linux日志记录

2015-1-26 00:25:16 | Linux | 没有评论

经常系统某个进程出现异常,就会不自然地通过查看log日志来定位问题,大多数的信息都是通过用户进程调用syslog来产生日志信息

一般进程读取的是syslog.conf配置文件,这个配置文件决定了不同种类的信息会送往何处,但在CentOS6.4上找不到这个配置文件,但是有一个rsyslog.conf文件,而且传统的守护进程syslogd也没有,应该是RHEL做了相应的修改

接口函数,指定了送信息的位[……]

Read more

信号量线程同步

2015-1-25 15:50:39 | Linux C | 没有评论

信号量是一种特殊类型的变量,可以被增加和减少,但是对其的访问被保证是原子操作,就算是多线程中也是如此,这样如果多个地方都试图修改信号量的值,能够保证以此进行

二进制信号量只有0和1两种取值,而计数信号量可以设置更大的范围;通常用来保护一段代码,让每次只能被一个执行线程执行,直接通过二进制信号量可实现

线程中用到的信号量函数有下面几个

#include <semaphore.h>
int[......]

Read more

Cygwin和Linux不同环境多线程加锁的差异

2015-1-23 01:00:36 | Linux C | 没有评论

深夜本来都打算弄完睡觉,结果被一个莫名其妙的锁搞得莫名其妙,为了让同步问题明显地表现出来,主线程和子线程都加了一个sleep 1秒,使得都来不及减减操作,if判断就都为真,导致结果变成了-1,但这不是想要的结果

于是想通过互斥量加锁,让一个if以及减减线执行完,然后解锁再执行另一个,可居然还是返回-1,更奇怪的是,去掉两个线程里的sleep,锁就起效果了,难道是这中间的具体实现流程问题没完全弄清楚[……]

Read more

多线程互斥量同步

2015-1-22 23:20:31 | Linux C | 没有评论

多线程在一个进程中有多个控制权,也会有多个函数同时运行,执行各自的CPU指令,就算单CPU,也可以通过线程间指令切换,达到多线程同时运行的效果

并发情况,不同线程之间指令无法确定执行先后顺序,假如这个顺序对运行结果造成影响,那么就会出现竞争,而且会出现问题,要解决竞争可以将原本分离的不同线程间的指令修改成原子操作,那么竞争自然就不存在了

多线程由于可以共享资源,因此同步问题必须要解决,在一定时间区[……]

Read more

线程执行小例子

2015-1-21 23:17:38 | Linux C | 没有评论

虽然成功地创建新的线程,但是需要知道这两个线程是否的确同时都在执行,可以通过一个小例子,这里就不考虑性能运行效率了

这里的想法就是设置一个全局变量,让它在0和1之间跳动,主线程在这个flag为0的时候,就打印0,并将flag赋值为1,而在这个过程当中,子线程沉睡1秒,;同样的接下来子线程在这个flag为1的时候,打印1,并将flag赋值为0,而这个过程中,主线程沉睡1秒,说白了也就是主线程和子线程[……]

Read more

线程终止

2015-1-21 16:03:18 | Linux C | 没有评论

在不终止整个进程的前提下,单个线程可通过pthread_exit退出,它的定义:

#include <pthread.h>

void pthread_exit(void *rval_ptr)

参数rval_ptr无类型指针,与创建线程最后一个参数传给子线程的参数类型一致,其它线程可以通过pthread_join访问这个指针

#include <pthread.h>
int p[......]

Read more

pid_t数据类型

2015-1-21 11:33:48 | Linux | 没有评论

CentOS6.4上,线程ID数据类型pthread_t在<bits/pthreadtypes.h>里定义了unsigned long,而进程ID的类型稍微稍微绕圈子一点

在unistd.h和sys/types.h都能找到:

<unistd.h>

# ifndef __pid_t_defined typedef __pid_t pid_t; # define __pid_t_[......]

Read more

简单创建线程

2015-1-21 01:24:55 | Linux C | 没有评论

线程和进程一样,也有唯一的线程ID,它的类型是pthread_t

在Linux里定义如下:

/* Thread identifiers.  The structure of the attribute type is not
   exposed on purpose.  */
typedef unsigned long int pthread_t;

而Windows下是一个结构体定义,Cygwin[……]

Read more

线程概念

2015-1-20 23:55:06 | Linux C | 没有评论

线程个人觉得比进程更有必要好好钻研一把,天天配置CPU Affinity,天天给每个线程绑定对应的Core ID,却没有从根本上弄明白机理,是一件十分尴尬的事情,无脑的东西不是应该崇尚的,APUE上关于线程概念写的十分漂亮,就直接COPY过来,然后加一些自己的理解,理论还是要透彻点

典型的UNIX进程可以看成是只有一个控制线程:一个进程在同一时刻只做一件事情;但有了多个控制线程以后,可以把进程设计[……]

Read more

信号

2015-1-18 20:42:47 | Linux C | 没有评论

Linux里信号是系统响应了某些条件而生成的一个事件,捕获到该信号的进程会相应地采取一些行动;信号是由于某些错误条件造成的,比如内存段冲突,浮点处理器错误或者非法指令等;它们由shell和终端处理器生成来引起中断,还可以作为在进程间传递消息或者修改行为的一种方式,明确地由一个进程发送给另一个进程

所有信号都在头文件signal.h里定义,以SIG开头,有兴趣可以自行搜索

如果进程接收到一个信号,但[……]

Read more

僵尸进程

2015-1-18 14:53:12 | Linux C | 没有评论

子进程是父进程调用fork生成的,如果父进程在子进程之前结束,那么对于对应的父进程都已经结束的所有子进程,它们的父进程都会变成init进程,也就是这些子进程被init进程领养;在一个进程结束时,内核会逐个检查所有的活动进程,来判断它是否是正要结束的子进程,如果是,就会将该进程的父进程ID改为1,也就是init这个进程,如此就保证了每个进程都有一个父进程

如果子进程在父进程之前结束,子进程会将其结束[……]

Read more

进程等待

2015-1-18 01:43:43 | Linux C | 没有评论

通过调用fork创建了一个子进程,通过返回值来判断,但始终无法并不知道结束顺序,比如下面在两个进程中,最后都分别执行message内容,并sleep 1秒钟,不过子进程执行了3次,而父进程仅仅执行一次,就会出现奇怪的现象~!

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main()[......]

Read more

Linux实时输出指定网卡流量

2015-1-17 22:05:09 | Perl | 没有评论

理论上能正常运行ifconfig的Linux操作系统都可适用这个脚本(当然一般默认会安装perl),打印实时网卡流量和丢包数,好久前当时为了验证输出流量随手写的,多次想改得漂亮点,一直没动手,就这样吧,以免用的时候找不到

其实我还想评论自己一句:把Perl写得跟C语言新手一样,真是Perl的悲哀!!!

#!/usr/bin/perl -w
##############################[......]

Read more

多个目标

2015-1-17 17:39:51 | Compiler | 没有评论

目前为止,Makefile都是执行一些简单的编译工作,这对于软件来说根本无法给用户使用,最终可执行程序以及目标文件都会安装到系统目录当中,这时候Makefile里仅仅只有目标文件的依赖关系和规则远远不够,至少应该还有clean和install

在初学Linux的时候,经常碰到make报错,fix了bug,修改了源代码,但是依旧编译不通过,但是make clean或者make distclean之后[……]

Read more

Makefile中的宏

2015-1-17 16:16:48 | Compiler | 没有评论

假如一个Makefile需要管理的是很多个源文件构成的工程,还一个一个地列出依赖关系,库文件和源文件,估计都要吐血了,所以就需要宏了

Makefile文件中的宏用来设置编译选项,在开发阶段一般不会进行优化,而是将debug信息给添加进去;而release的时候,却正好反过来,不包含任何调试debug信息,符号表之类的,而是让可执行程序性能优化得越快越好

Linux下编译器gcc,其它类UNIX系统[……]

Read more

make

2015-1-17 02:34:33 | Compiler | 没有评论

make命令内置了很多智能的机制,除此还提供一个Makefile文件,来告诉它处理流程,文件由一组依赖关系和规则组成,而每个依赖关系由一个目标和该目标的一些依赖组成,规则描述了这些依赖如何创建目标;make命令会先读取Makefile文件内容,确定目标文件,然后会创建一些中间目标,最终根据Makefile确定目标文件创建过程以及调用顺序

make命令一般有三个选项

-k:make执行时如果出错仍然[……]

Read more

格式化输出

2015-1-16 21:10:12 | Linux | 没有评论

printf一系列函数能将各种不同类型的参数进行格式编排和输出,每个参数在输出流中的表现形式由格式参数format来控制,包含了需要输出的普通字符和转换控制符代码的字符串,转换控制符规定了其余参数的输出方式和输出地方

#include <stdio.h>

int printf(const char *format, ...);
int sprintf(char *s, const ch[......]

Read more

fork多进程

2015-1-15 23:36:29 | Linux C | 没有评论

每个进程都有一个非负整数的PID,可以通过下面函数返回

#include <unistd.h>

//进程ID
pid_t getpid(void);

//父进程ID
pid_t getppid(void);

而调用fork函数可以创建新进程,即子进程;fork被调用一次,就好像copy了一份副本,返回两次,父进程的返回值是子进程的进程ID,子进程的返回值是0

在调用fork之后,子进[……]

Read more

标准IO库缓冲区

2015-1-14 01:09:41 | Linux C | 没有评论

看到标准IO库,总会不自然地往回翻文件IO的部分

文件IO里的read,write都是内核态系统调用,依赖于操作系统来对文件进行读写,虽然速度快,但都是不带缓冲的,而且之前有写IO的效率,CPU用时还与其中一个参数每次读取的字节数相关

标准库IO会先在内存开辟一个缓冲区,给程序中文件来使用,比如执行读操作,先从磁盘文件将数据读入内存缓冲区,满了之后再从内存缓冲区一次读入;写操作先将数据写入内存缓冲[……]

Read more

Linux下C访问MySQL

2015-1-13 17:24:30 | Middleware | 没有评论

前几天Windows下安装了下mysql,然后编译了一个C程序访问mysql数据库,结果都无法连上,原因未知,同样的source code直接copy到CentOS上来试试

1:安装mysql

sudo yum install mysql mysql-devel mysql-server

然后直接通过service来启动

sudo service mysqld start

2:编译运行

直接将wind[……]

Read more

C接口访问MySQL

2015-1-12 00:38:56 | Middleware | 没有评论

看了下mysql的API,访问数据库也不是太难,当然啥都是看起来容易,做起来难

Windows开发环境不太熟,懒的去配置一堆东西,而且我mysql所有头文件和库文件都存在E盘,我就借用Cygwin,将头文件和库文件copy到相应的/usr/include和/usr/lib目录下,通过GCC来进行编译,进而运行进行访问

(1)mysql_init初始化连接句柄

#include <mysql.h[......]

Read more