mysql数据变化通通知机制_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

#include

#include

#include

#define FOLDER_MAXLEN128

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

#include

#include

#include <

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值