导航:首页 > 文件类型 > linux文件异步

linux文件异步

发布时间:2023-06-02 12:44:34

linux中rsync异步服务器实现文件同步与备份

Rsync
非常适合在两台机器之间快速同步大型、复杂的目录,例如论坛的附件目录。再配合
ssh
,则安全性也有保证,且可以利用
ssh
public
key

cron
来进行自动定时同步。
说明:两台机器分别为
localhost

remotehost
;用户分别为
localuser

remoteuser。
环境:FreeBSD
4.9

FreeBSD
6.1
代码如下

设置
ssh
public
key
认证
$ssh-keygen
-t
dsa
-b
2048
生成所需的密钥
$scp
/home/localuser/.ssh/id_dsa.pub
remoteuser@remotehost:/home/remoteuser/.ssh/localuser_id_dsa.pub
将公钥拷贝至
remotehost
$ssh
remoteuser@remotehost
登录到?端
代码如下

$cd
.ssh/
;
cat
localuser_id_dsa.pub
>>
authorized_keys
至此,设置
ssh
认证完毕。
设置
rsync
确认两端机器都安装
rsync

freeBSD

ports
,安装非常方便。
写个脚本名为
backup.sh
,内容如下:
代码如下

#!/bin/sh
RSYNC=/usr/local/bin/rsync
SSH=/usr/bin/ssh
KEY=/home/localuser/.ssh
/id_rsa
RUSER=remoteuser
RHOST=remotehost
RPATH=/remote/dir
LPATH=/this/dir
$RSYNC
-az—delte
-e
“$SSH
-i
$KEY”
$RUSER@$RHOST:$RPATH
$LPATH
-a
选项相当于选项
-rlptgoD
。简单来讲,此选项可递归并将几乎所有的东西同步过去,非常有用。注意的是,
-a
默认不会保存
hardlinks
,不过可以单独用
-H
选项来实现。
-z
选项在传输中压缩文件,这无疑加快同步速度。
-delete
选项会删除接受方一些不应存在的文件,此文件在发送方已经被删除,这将保持目录完全同步。

cron
每天凌晨1点来跑这个脚本
代码如下

$crontab
-e
0
1
*
*
*
/home/localuser/bin/backup.sh
友情提示
rsync是没有自动启动同步功能了,如果我们要定时去备份一个网站数据我们就需要用到定时功能了,上面的例子来使用到了linux中$crontab命令来定时执行备份数据脚本了哦。

Ⅱ linux异步IO怎么理解

就是来IO不阻塞即使没有数自据可读,或者空间可写时。异步IO都返回,不管如何情况。简单点的意思就是进程不会阻塞在你读写调用异步IO系统调用的时候。所以你的执行流可以去做其它的事情,当你确实要确认数据读写成功的时候,你在用aio_return这个函数去判断读写成功了吗。如果你想耗费cpu那你就一值调用aio_return轮询结果。如果想睡眠等待读写完成,那么你调用aio_suspend这个函数,你就会睡眠,当读写完成时,内核会发信号给你,这时,就会执行信号处理函数,并唤醒此进程。要充分理解异步IO,最好把信号和异步通知一起搞懂。如果会写驱动的话,最好自己去实现IO的这些功能,比如阻塞IO,非阻塞IO,轮询,异步通知,异步IO等等,其中又涉及到并发和竞争的问题。

Ⅲ Linux中同步信号和异步信号分别怎么解释

Linux异步信号
1.int pthread_kill(pthread_t threadid, intsigno);
向特定的线程发送信号signo
2.int pthread_sigmask(int how, const sigset_t*newmask, sigset_t *oldmask);
设置线程的信号屏蔽码
3.int sigwait(const sigset_t *set, int *sig);
阻塞线程,等待set中指定的信号之一到达,并将到达的信号存入*sig。
4.代码
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <signal.h>
//#define SIGUSRR 40;
int SIGUSRR = 40;
void* threadOne(void *arg)
{
sigset_tsigset;
intsigno;
sigemptyset(&sigset);
sigaddset(&sigset,SIGUSRR);
pthread_sigmask(SIG_BLOCK,&sigset, NULL);
while(1)
{
sigwait(&sigset,&signo);
printf("getthread cond sig!\n");
}
}
int main(int argc, char **argv)
{
if(argc != 1)
{
printf("Usage:\n");
printf("threadcond\n");
return1;
}
pthread_tthreadId;
if(pthread_create(&threadId,NULL, threadOne, NULL) != 0)
{
printf("threadcreate error! \n");
return1;
}
//structsigaction act;
//act.sa_handler=SIG_IGN;
//sigemptyset(&act.sa_mask);
//act.sa_flags=0;
//sigaction(SIGUSRR,&act,0);//设置信号SIGUSR1的处理方式忽略
usleep(1000000);
pthread_kill(threadId,SIGUSRR);
usleep(1000000);
pthread_kill(threadId,SIGUSRR);
usleep(2000000);
return0;
}

Ⅳ LINUX进程的异步并发执行

fork出来的子进程和原父进程是并行的。
所以,在第一个父进程处fork出一个,然后在接下的代码中,因为字进程也要接着从此处执行下去,
需要需要做判断,这个判断是为了区分父子进程,如何判断?通过判断PID。
因为你要产生2个子进程,不妨,第一个产生一个字进程,这个子进程再产生一个子进程,通过判断PID,决定执行什么代码。
判断PID的时候,父进程fork后,父子进程均取getpid这样类似的函数,会发现,得到的值是不一样的,这就可以判断了。

Ⅳ linux 异步i/o和信号驱动i/o的区别

这里假设你指的异步I/O是针对的文件描述符,而信号驱动IO面向的是读写信号本身版。
比较典型权的例子是select和epoll的对比。使用select之前需要预先添加你所有感兴趣的文件描述符,然后再遍历这些文件描述符,找出其中有读写事件的fd,之后再对这些活跃的fd做处理。相比而言,epoll会高效得多:每当有一个fd的读写事件,内核则把该fd添加进一个事件列表,在使用的时候你只需要去取到这个事件列表(一个链表的数据结构)即可做相应操作。
这样说来,就是上面说的,一个是扫描的文件描述符再判断该文件描述符是否需要处理,这个是fd驱动;一个是直接取到有事件发生的文件描述符,也就是信号,或者说是事件驱动。

Ⅵ linux驱动模块中添加异步通知机制需要完成哪些工作

一 驱动方面:
1. 在设备抽象的数据结构中增加一个struct fasync_struct的指针
2. 实现设备操作中的fasync函数,这个函数很简单,其主体就是调用内核的fasync_helper函数。
3. 在需要向用户空间通知的地方(例如中断中)调用内核的kill_fasync函数。
4. 在驱动的release方法中调用前面定义的fasync函数
呵呵,简单吧,就三点。其中fasync_helper和kill_fasync都是内核函数,我们只需要调用就可以了。在1中定义的指针是一个重要参数,fasync_helper和kill_fasync会使用这个参数。

二 应用层方面
1. 利用signal或者sigaction设置SIGIO信号的处理函数
2. fcntl的F_SETOWN指令设置当前进程为设备文件owner
3. fcntl的F_SETFL指令设置FASYNC标志
完成了以上的工作的话,当内核执行到kill_fasync函数,用户空间SIGIO函数的处理函数就会被调用了。
呵呵,看起来不是很复杂把,让我们结合具体代码看看就更明白了。
先从应用层代码开始吧:

#include <sys/types.h>

#include <sys/stat.h>

#include <stdio.h>

#include <fcntl.h>

#include <signal.h>

#include <unistd.h>

#define MAX_LEN 100

//处理函数,没什么好讲的,用户自己定义

void input_handler(int num)
{

char data[MAX_LEN];

int len;
//读取并输出STDIN_FILENO上的输入

len = read(STDIN_FILENO, &data, MAX_LEN);
data[len] = 0;
printf("input available:%s\n", data);
}

void main()

{

int oflags;

//启动信号驱动机制,将SIGIO信号同input_handler函数关联起来,一旦产生SIGIO信号,就会执行input_handler

signal(SIGIO, input_handler);

//STDIN_FILENO是打开的设备文件描述符,F_SETOWN用来决定操作是干什么的,getpid()是个系统调用,

//功能是返回当前进程的进程号,整个函数的功能是STDIN_FILENO设置这个设备文件的拥有者为当前进程。
fcntl(STDIN_FILENO, F_SETOWN, getpid());

//得到打开文件描述符的状态

oflags = fcntl(STDIN_FILENO, F_GETFL);

//设置文件描述符的状态为oflags | FASYNC属性,一旦文件描述符被设置成具有FASYNC属性的状态,
//也就是将设备文件切换到异步操作模式。这时系统就会自动调用驱动程序的fasync方法。
fcntl(STDIN_FILENO, F_SETFL, oflags | FASYNC);

//最后进入一个死循环,程序什么都不干了,只有信号能激发input_handler的运行

//如果程序中没有这个死循环,会立即执行完毕
while (1);
}
再看驱动层代码,驱动层其他部分代码不变,就是增加了一个fasync方法的实现以及一些改动

//首先是定义一个结构体,其实这个结构体存放的是一个列表,这个

//列表保存的是一系列设备文件,SIGIO信号就发送到这些设备上
static struct fasync_struct *fasync_queue;

//fasync方法的实现
static int my_fasync(int fd, struct file * filp, int on)

{

int retval;
//将该设备登记到fasync_queue队列中去

retval=fasync_helper(fd,filp,on,&fasync_queue);
if(retval<0)

{
return retval;

}
return 0;

}
在驱动的release方法中我们再调用my_fasync方法

int my_release(struct inode *inode, struct file *filp)

{

//..processing..

drm_fasync(-1, filp, 0);

//..processing..
}这样后我们在需要的地方(比如中断)调用下面的代码,就会向fasync_queue队列里的设备发送SIGIO信号
,应用程序收到信号,执行处理程序
if (fasync_queue)
kill_fasync(&fasync_queue, SIGIO, POLL_IN);

阅读全文

与linux文件异步相关的资料

热点内容
看视频写文件格式 浏览:2
大数据平台怎么审绿 浏览:398
java打包教程 浏览:787
电脑有多少个文件夹 浏览:1
dnf86版本极限光强 浏览:974
国考资料分析哪里来的数据 浏览:87
文件拷贝到u盘以后md5变化 浏览:281
kali中pdf攻击文件生成 浏览:507
专利检索如何找到最接近对比文件 浏览:673
文件描述符inode 浏览:342
ps多边形套索工具抠图 浏览:957
u盘文件怎样加密 浏览:431
如何将多个pdf文件合成一个 浏览:652
桌面文件隐藏图片 浏览:204
word分44 浏览:521
信息网络通讯研究所是研究什么的 浏览:602
简述创建数据库的过程 浏览:607
手机上哪些自带文件不能删 浏览:474
济南java程序员工资 浏览:643
网络优化主要有 浏览:140

友情链接