linux文件系统变化通知机制
一、dnotify机制
1、使用
通过对文件描述符设置监听信号实现。
//设置文件相应信号
fcntl(fd, F_SETSIG, SIGRTMIN + 1);
//设置该文件要监听事件
fcntl(fd, F_NOTIFY, DN_ACCESS|DN_MODIFY|DN_CREATE|DN_RENAME|DN_DELETE|DN_ATTRIB|DN_MULTISHOT);
剩下的就是信号处理了。
2、缺点
缺点1:dnotify机制对监视的每个文件夹都打开了一个文件描述符,如果文件夹所在文件系统需要umount就不行了。
缺点2:dnotify机制只能对文件夹进程监视。
3、应用
例子:
//要用fcntl( fd, F_SETSIG, SIGRTMIN + 1 )就要设置这个宏
#define _GNU_SOURCE 1
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#define FOLDER_MAXLEN 128
static char listen_folder[FOLDER_MAXLEN];
static void myhandler( int );
int set_folder_signal( void )
{
struct sigaction act;
int fd;
act.sa_handler = myhandler;
sigemptyset( &act.sa_mask );
act.sa_flags = 0;
sigaction( SIGRTMIN + 1, &act, NULL );
if(( fd = open( listen_folder, O_RDONLY )) < 0 )
return -1;
printf( "fd=%d\n", fd );
fcntl( fd, F_SETSIG, SIGRTMIN + 1 );
fcntl( fd, F_NOTIFY, DN_CREATE );
return 0;
}
int main(int argc, char *argv[] )
{
if( argc != 2 )
{
printf( "%s filepath\n", argv[0] );
exit( 0 );
}
strncpy( listen_folder, argv[1], FOLDER_MAXLEN - 1 );
if( set_folder_signal( ) < 0 )
{
printf( "set signal to %s fail\n", argv[1] );
exit( 0 );
}
while( 1 )
{
pause();
printf( "a signal return\n" );
}
}
static void myhandler( int signo )
{
printf( "signalno=%d,a file was creat\n", signo );
set_folder_signal();
}
以上例子信号处理函数只能得到信号编号信息。可以通过sa_sigaction信号处理函数来获得更多信息,但也很有限。比如文件描述符。
例子:
//要用fcntl( fd, F_SETSIG, SIGRTMIN + 1 )就要设置这个宏
#define _GNU_SOURCE 1
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <
相关文档:
2009 年 4 月 23 日
本文中我们针对 Linux 上多线程编程的主要特性总结出 5 条经验,用以改善 Linux 多线程编程的习惯和避免其中的开发陷阱。在本文中,我们穿插一些 Windows 的编程用例用以对比 Linux 特性,以加深读者印象。
背景
Linux 平台上的多线程程序开发相对应其他平台(比如 Windows)的多线程 API 有一些细微 ......
# cd /home/tmp (进入压缩包所在目录)
# groupadd mysql (建立mysql组)
# useradd -g mysql mysql (在mysql组中建立mysql用户)
# tar -zxvf mysql-5.0.37.tar.gz (解压mysql源码,bz2压缩包请用“tar -jvxf 文件名”指令)
# cd mysql-5.0.37 (进入解压目录)
# ./configure --prefix=/usr/local/mysql (p ......
一、硬盘分区与文件系统
1) 通常在拿到一块新的硬盘时,会将硬盘分割成几个不同的分区(partition)
2) 分好分区后,要把这些分区格式化(Format)成特定的文件系统格式(File System Format),才能够用来储存文件。格式化就是把分区切割成一个个小单位(称为block),并且block依序编号。block是储存文件内容的最小单位。在预设 ......
1.安装时要执行两个脚本,root.sh是其中一个。
需要用root用户执行root.sh去生成/etc/oratab文件。————1.dbca中不会有删除选项(因为运行时需要/etc/oratab)
& ......