青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Prayer

在一般中尋求卓越
posts - 1256, comments - 190, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

aio_read template.

Posted on 2009-04-02 10:35 Prayer 閱讀(982) 評論(0)  編輯 收藏 引用 所屬分類: C/C++LINUX/UNIX/AIX
Volker,
Here is a template for the way we'd use aio_read within Samba3.
Seems to work well on 2.6 kernels. It's a standalone program that will
copy a file using aio_read. The one thing I haven't coped with is a
short read from aio_read (not an EOF read, but just reading less bytes
than we asked for). I'm not sure if this is possible with the aio_read
interface but thought I'd just warn you....
Hopefully you'll find this useful.
Jeremy.
-------------- next part --------------
/*
Sample aio_read code as would be used in Samba3.
Copyright (C) Jeremy Allison, 2005.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h>
#include <fcntl.h>
#include <time.h>
#include <strings.h>
#include <aio.h>
#ifndef MIN
#define MIN(a,b) ((a)<(b)?(a):(b))
#endif
#ifndef MAX
#define MAX(a,b) ((a)>(b)?(a):(b))
#endif
int set_blocking(int fd, int set)
{
int val;
if((val = fcntl(fd, F_GETFL, 0)) == -1)
return -1;
if(set) /* Turn blocking on - ie. clear nonblock flag */
val &= ~O_NONBLOCK;
else
val |= O_NONBLOCK;
return fcntl( fd, F_SETFL, val);
}
static pid_t initialised;
static int select_pipe[2];
static volatile unsigned pipe_written, pipe_read;
/*******************************************************************
Call this from all Samba signal handlers if you want to avoid a
nasty signal race condition.
********************************************************************/
void sys_select_signal(void)
{
char c = 1;
if (!initialised) {
return;
}
if (pipe_written > pipe_read+256) {
return;
}
if (write(select_pipe[1], &c, 1) == 1) {
pipe_written++;
}
}
/*******************************************************************
Like select() but avoids the signal race using a pipe
it also guuarantees that fds on return only ever contains bits set
for file descriptors that were readable.
********************************************************************/
int sys_select(int maxfd, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct timeval *tval)
{
int ret, saved_errno;
fd_set *readfds2, readfds_buf;
if (initialised != getpid()) {
pipe(select_pipe);
/*
* These next two lines seem to fix a bug with the Linux
* 2.0.x kernel (and probably other UNIXes as well) where
* the one byte read below can block even though the
* select returned that there is data in the pipe and
* the pipe_written variable was incremented. Thanks to
* HP for finding this one. JRA.
*/
if(set_blocking(select_pipe[0],0)==-1)
exit(1);
if(set_blocking(select_pipe[1],0)==-1)
exit(1);
initialised = getpid();
}
maxfd = MAX(select_pipe[0]+1, maxfd);
/* If readfds is NULL we need to provide our own set. */
if (readfds) {
readfds2 = readfds;
} else {
readfds2 = &readfds_buf;
FD_ZERO(readfds2);
}
FD_SET(select_pipe[0], readfds2);
errno = 0;
ret = select(maxfd,readfds2,writefds,errorfds,tval);
if (ret <= 0) {
FD_ZERO(readfds2);
if (writefds)
FD_ZERO(writefds);
if (errorfds)
FD_ZERO(errorfds);
} else if (FD_ISSET(select_pipe[0], readfds2)) {
char c;
saved_errno = errno;
if (read(select_pipe[0], &c, 1) == 1) {
pipe_read++;
/* Mark Weaver <mark-clist at npsl.co.uk> pointed out a critical
fix to ensure we don't lose signals. We must always
return -1 when the select pipe is set, otherwise if another
fd is also ready (so ret == 2) then we used to eat the
byte in the pipe and lose the signal. JRA.
*/
ret = -1;
errno = EINTR;
} else {
FD_CLR(select_pipe[0], readfds2);
ret--;
errno = saved_errno;
}
}
return ret;
}
void BlockSignals(int block,int signum)
{
sigset_t set;
sigemptyset(&set);
sigaddset(&set,signum);
sigprocmask(block?SIG_BLOCK:SIG_UNBLOCK,&set,NULL);
}
#define SIG_AIO_READ_DONE (SIGRTMIN)
#define AIO_PENDING_SIZE 10
static sig_atomic_t signals_received;
static struct aiocb aio_pending_array[AIO_PENDING_SIZE];
static void process_completed_read(int fd_out, char *buf, off_t *p_curr_off, int *p_finished)
{
struct aiocb a;
ssize_t nbytes_read;
BlockSignals(1, SIG_AIO_READ_DONE);
a = aio_pending_array[0];
memset(&aio_pending_array[0], '\0', sizeof(a));
if (signals_received > 1) {
memmove(&aio_pending_array[0],
&aio_pending_array[1],
sizeof(a)*(signals_received-1));
}
signals_received--;
/* now we can receive more signals */
BlockSignals(0, SIG_AIO_READ_DONE);
nbytes_read = aio_return(&a);
if (nbytes_read == -1) {
fprintf(stderr, "Error in aio_read: %s\n", strerror(errno) );
exit(1);
}
if (nbytes_read == 0) {
/* End of file. */
*p_finished = 1;
return;
}
if (pwrite(fd_out, buf, nbytes_read, *p_curr_off) != nbytes_read) {
fprintf(stderr, "Error in write: %s\n", strerror(errno) );
exit(1);
}
*p_curr_off += nbytes_read;
printf("New offset = 0x%x\n", *p_curr_off);
}
static void schedule_aio_read(struct aiocb *a, int fd_in, char *buf, size_t bufsize, off_t cur_offset)
{
memset(a, '\0', sizeof(struct aiocb));
a->aio_fildes = fd_in;
a->aio_buf = buf;
a->aio_nbytes = bufsize;
a->aio_offset = cur_offset;
a->aio_sigevent.sigev_notify = SIGEV_SIGNAL;
a->aio_sigevent.sigev_signo  = SIG_AIO_READ_DONE;
a->aio_sigevent.sigev_value.sival_ptr = (void *)a;
aio_read(a);
}
static void signal_handler(int sig, siginfo_t *info, void *unused)
{
if (signals_received < AIO_PENDING_SIZE - 1) {
aio_pending_array[signals_received] = *(struct aiocb *)(info->si_value.sival_ptr);
signals_received++;
} /* Else signal is lost. */
sys_select_signal();
}
int main(int argc, char **argv)
{
int fd_in;
int fd_out;
sigset_t io_set;
struct sigaction sa;
int finished = 0;
int schedule_next_read = 1;
off_t curr_offset = 0;
struct timeval tval;
struct aiocb a;
char buf[4096];
if (argc != 3) {
printf("Usage: %s fromfile tofile\n");
exit(1);
}
fd_in = open(argv[1], O_RDONLY);
if (fd_in == -1) {
fprintf(stderr, "open of %s failed: %s\n", argv[1], strerror(errno));
exit(1);
}
fd_out = open(argv[2], O_CREAT|O_TRUNC|O_RDWR, 0644);
if (fd_out == -1) {
fprintf(stderr, "open of %s failed: %s\n", argv[2], strerror(errno));
exit(1);
}
memset(&sa, '\0', sizeof(struct sigaction));
sa.sa_sigaction = signal_handler;
sa.sa_flags = SA_RESTART|SA_SIGINFO;
//sa.sa_flags = SA_SIGINFO;
sigemptyset(&sa.sa_mask);
sigaddset(&sa.sa_mask, SIG_AIO_READ_DONE);
if (sigaction( SIG_AIO_READ_DONE, &sa, NULL) == -1) {
fprintf(stderr, "sigaction failed: %s\n", strerror(errno));
exit(1);
}
/* Ensure the signal pipe exists before we start the aio so we don't
lose the signal write down the pipe (which we would if the pipe hadn't
been created. This isn't a problem in a real smbd. */
tval.tv_sec = 0;
tval.tv_usec = 0;
sys_select(0,NULL,NULL,NULL,&tval);
while (!finished) {
int ret;
if (schedule_next_read) {
schedule_aio_read(&a, fd_in,buf,sizeof(buf),curr_offset);
schedule_next_read = 0;
}
printf("signals_received = %d\n", signals_received);
ret = sys_select(0,NULL,NULL,NULL,NULL);
if (signals_received && ret == -1 && errno == EINTR) {
process_completed_read(fd_out, buf, &curr_offset, &finished);
schedule_next_read = 1;
}
}
close(fd_in);
close(fd_out);
return 0;
}
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            日韩午夜一区| 国产欧美日韩综合一区在线播放| 久久激情五月丁香伊人| 亚洲欧美久久久| 性做久久久久久久久| 久久精品一区二区三区不卡牛牛| 久久夜色精品国产欧美乱| 欧美成人a视频| 欧美午夜不卡在线观看免费| 国产日韩亚洲欧美综合| 黑人巨大精品欧美黑白配亚洲| 91久久精品美女高潮| 亚洲在线成人精品| 免费人成精品欧美精品| 日韩视频亚洲视频| 国产精品久久久久久久久借妻| 在线成人国产| 亚洲女同在线| 欧美激情在线免费观看| 亚洲欧美日韩精品久久| 欧美另类一区二区三区| 狠狠色综合网| 亚洲国产欧美一区二区三区同亚洲 | 久久精品五月婷婷| 亚洲国产精品成人| 久久激情综合网| 亚洲美女视频网| 国产三级欧美三级日产三级99| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美gay视频激情| 国产在线高清精品| 欧美一区亚洲一区| 一区二区三区视频在线播放| 欧美sm重口味系列视频在线观看| 亚洲视频在线免费观看| 欧美激情在线| 国产伦一区二区三区色一情| 亚洲免费小视频| 久久综合伊人77777蜜臀| 一区二区视频在线观看| 久久久免费精品视频| 亚洲欧美韩国| 日韩亚洲欧美一区二区三区| 亚洲国产精品成人综合| 国产精品网曝门| 久久久久**毛片大全| 欧美一区二区视频免费观看| 国产美女精品| 99精品国产99久久久久久福利| 欧美屁股在线| 欧美99在线视频观看| 玖玖国产精品视频| 欧美综合国产| 老司机精品视频网站| 欧美一级免费视频| 久久精品论坛| 久久se精品一区二区| 欧美日韩美女一区二区| 亚洲欧美日韩综合国产aⅴ| 亚洲天堂成人在线视频| 国产日本欧美在线观看| 一本色道久久88亚洲综合88| 亚洲伦理在线| 午夜精品一区二区三区在线 | 国产精品久久久久7777婷婷| 亚洲高清免费| 国产精品久久一卡二卡| 久久久久久久久一区二区| 国产精品成人va在线观看| 亚洲精品一区二| 国产精品一区二区三区四区五区| 99xxxx成人网| 亚洲欧美成人| 国产精品久在线观看| 亚洲丝袜av一区| 性久久久久久久| 国产麻豆精品久久一二三| 亚洲自拍另类| 久久国产66| 激情国产一区二区| 久久亚洲色图| 欧美激情亚洲自拍| 一本色道**综合亚洲精品蜜桃冫 | 麻豆精品在线观看| 欧美日韩国产探花| 久久亚洲精品一区| 欧美视频免费在线观看| 免费在线日韩av| 最新国产精品拍自在线播放| 欧美成人高清视频| 亚洲精品永久免费| 欧美一级专区免费大片| 国产午夜亚洲精品不卡| 久久久久国色av免费看影院| 亚洲视频免费看| 国产精品一区二区三区免费观看| 欧美在线观看你懂的| 亚洲愉拍自拍另类高清精品| 国产精品视频第一区| 久久久精品999| 亚洲精品在线观| 久久精品中文| 日韩小视频在线观看专区| 欧美性猛片xxxx免费看久爱| 欧美一区三区二区在线观看| 欧美成人激情在线| 亚洲自拍偷拍一区| **网站欧美大片在线观看| 欧美在线影院| 亚洲精品小视频| 久久久午夜视频| 99精品国产一区二区青青牛奶| 国产欧美va欧美不卡在线| 久久男女视频| 亚洲午夜高清视频| 91久久国产综合久久91精品网站| 亚洲高清免费| 国产精品久久久久久久第一福利| 久久久久久久尹人综合网亚洲| 一本大道久久a久久综合婷婷| 久久一二三区| 欧美一二三视频| 99精品视频免费观看视频| 精品999在线播放| 国产精品久久久久久久久搜平片 | 久久激情五月激情| 一区二区动漫| 91久久精品国产91久久性色tv| 久久成年人视频| 亚洲欧美国产精品桃花| 亚洲区在线播放| 精品99一区二区| 国产精品自拍网站| 欧美性开放视频| 欧美日韩成人综合在线一区二区 | 欧美极品色图| 亚洲精品系列| 欧美激情a∨在线视频播放| 久久精品国语| 久久精品夜色噜噜亚洲a∨| 亚洲午夜久久久| 国产欧美一区二区精品性色| 欧美三级电影一区| 欧美日本国产| 欧美久色视频| 欧美日韩亚洲高清| 欧美精品一区二区三区在线看午夜 | 亚洲网站视频| 一区二区三区蜜桃网| 99视频精品免费观看| 99国产精品久久久| 亚洲最新色图| 亚洲永久字幕| 亚洲国产综合视频在线观看| 欧美二区乱c少妇| 亚洲一区二区日本| 亚洲视频在线二区| 亚洲一区二区三区在线| 亚洲视频在线免费观看| 亚洲校园激情| 欧美在线综合视频| 久久久五月婷婷| 欧美成人r级一区二区三区| 亚洲二区免费| 亚洲啪啪91| 老司机精品久久| 欧美国产第二页| 亚洲蜜桃精久久久久久久| 一本色道久久加勒比88综合| 亚洲性线免费观看视频成熟| 性伦欧美刺激片在线观看| 久久国产精品99精品国产| 久久综合999| 欧美日韩亚洲系列| 国产日韩亚洲欧美综合| 亚洲激情电影在线| 国产在线精品成人一区二区三区| 又紧又大又爽精品一区二区| 亚洲国产精品成人| 亚洲网站在线观看| 久久久999国产| 亚洲人体1000| 午夜亚洲激情| 欧美精品首页| 国产一级揄自揄精品视频| 国产精品久久久久7777婷婷| 狠狠久久五月精品中文字幕| 91久久在线播放| 欧美一区二区三区播放老司机| 欧美国产先锋| 亚洲一区三区视频在线观看| 狂野欧美激情性xxxx| 国产精品免费看| 亚洲欧洲一区二区在线观看| 欧美一级淫片播放口| 亚洲承认在线| 最新高清无码专区| 欧美在线影院| 国产精品激情电影| 亚洲国产一二三|