-
Signal 数据结构解析 - [Linux]
2007-08-16
1. sigaction结构体
struct sigaction {
union{
__sighandler_t _sa_handler;
void (*_sa_sigaction)(int,struct siginfo_t *, void *);
}_u
sigset_t sa_mask;
unsigned long sa_flags;
void (*sa_restorer)(void);}
union中的第一个__sighandler_t代表单参数信号处理函数,参数为信号值,还可以为系统提供的值如:
#define SIG_ERR ((__sighandler_t) -1) /* Error return. */
#define SIG_DFL ((__sighandler_t) 0) /* Default action. */
#define SIG_IGN ((__sighandler_t) 1) /* Ignore signal. */
union中的第二个函数指针,使用户可以自己定义三参数信号处理函数,其中第二个参数类型siginfo_t,定义如下:2. 对于real-time signal,结构定义如下:
typedef struct { int si_signo; /* 信号值,对所有信号有意义*/int si_errno; /* errno值,对所有信号有意义*/
int si_code; /* 信号产生的原因,对所有信号有意义*/
union sigval si_value; /*对real-time signal 有意义 */
} siginfo_t;第四个union定义如下:3.union sigval {int sival_int;void *sival_ptr;}该结构指明value要么是一个整形的值,或者是一个指针,这就使得编程者可以通过传递指针来传递一个
复杂的对象或结构。
* 信号函数之间的参数传递情况如下:
sigqueue 函数的第三参数,参数sigval将传递(拷贝)到sigaction函数的第二参数
sigaction结构体中的_sa_sigaction
指向函数的siginfo_t中的si_value值。(拗口!) -
Real-time Signal 学习 - [Linux]
2007-08-16
Real-time signal 是linux 2.3内核后引入的新的feature。类似于win32的Completion Port, Realtime signal 机制可用于反应器,适用于server的高速IO模型。
Real-time signal 的原理是,将文件描述符通过fnctl 设置为nonblock,类似这样:
nflags |= O_RDWR | O_NONBLOCK | O_ASYNC;
nFcntl = ::fcntl(aFd, F_SETFL, nflags);再将该句柄与具体的real-time signal 绑定,
nFcntl = ::fcntl(aFd, F_SETSIG, RTSIG_X)
最后设置这个描述符将该信号报往的进程Pid
nFcntl = ::fcntl(aFd, F_SETOWN, Pid);
这些工作做完之后,当该文件描述符发生io操作时将上报给进程real-time signal RTSIG-X
而reactor可以run一个工作线程,并设置感兴趣的信号集sigset为阻塞状态
nRet = ::sigprocmask(SIG_BLOCK, &sigset, NULL);
linux proc/ 文件系统中的设置rt signal 最大值的文件是/proc/sys/kernel/rtsig-max,可以通
_sysctl命令进行调解。节点名为{ CTL_KERN, KERN_RTSIGMAX }
OK, 一切做完之后,我们只要将工作线程run起来后,做等待信号操作
sigRet = ::sigwaitinfo(&sigset, &siginfo);
返回后并检查siginfo.si_band的值,如果是POLLERR|POLLHUP|POLLNVAL 为error值,
否则处理该句柄,进行相应的读写操作。
while(!shutDown())
{
int sigret = sigwaitinfo(&sigset, &siginfo);
...
handleEvent(sigret,...)
} -
Linux 下创建基于Image的小分区 - [Linux]
2007-08-03
有需求要检查应用程序当磁盘满时的内存激增现象,写满物理硬盘不仅困难且自身的额外操作也将受到限制,采用linux下自带命令可创建一个ext2的Image,将此Image mount进系统,就可完成一个新分区的创建。过程如下
1. dd if=/dev/hda1 of=image.iso bs=2048 count=1024 // 创建一个block size为2048bytes,1024个block的空文件image.iso
2. losetup /dev/loop0 image.iso // 因image.iso不是块设备,不能进行文件系统创建,需要将其和一个块设备联系起来
3. mkfs -t ext2 /dev/loop0 // 创建ext2文件系统
4. mount -t ext2 /dev/loop0 /mnt //将设备mount到/mnt目录中
...............................// 进行对mnt的操作,拷贝文件等
5. umount /mnt
6. losetup -d /dev/loop0 // 解除联系
此后就可以用mount -t ext2 -o loop image.iso /mnt/ 来直接mount该分区了
-
Compile kernel 2.6.21, Upgrade GTK+2.0 (RH 8.0) - [Linux]
2007-07-10
为了编译2.6的内核,使用make menuconfig/xconfig 不是惨不忍睹就是失败(xconfig need Gtk+ > 2.0)。不得已走上了编译GTK+2.0的路.
依赖顺序如下:
首先将pkgconfig-0.15升上去,后面都要依赖它。它的作用主要是为configure 提供软件包的具体路径之用。
freetype-2.1.10 --> fontconfig-2.4.1(for cario)
render-0.8-->xrender-0.8.3
libpng-1.2.18, xproto-7.0.5, xrender-0.8.3, fontconfig-2.4.1--> cairo-1.2.0
atk-1.10.1, pango-1.13.0, cairo-1.2.0, libglade-2.0.1, glib-2.12.0 --> gtk+-2.10.0
呼,终于升级完成了GTK+-2.0 版本
想编译2.6 的内核还需要升级binutils-2.17, 否则最后objcopy 会crash。 最后还要升级module-init-tools-3.2,否则模块就算modules_install 后也别想加载起来。
-
linux kernel 体系结构 - [Linux]
2007-07-04

linux 系统软件体系结构如图,user mode 进程需要通过glibc作一个到kernel mode 的转换

Linux kernel 的体系结构
进程管理:linux/arch/xxx 依赖于具体体系结构
内存管理:linux/mm/
VFS: linux/fs
协议栈: linux/net
设备驱动:linux/drivers







