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

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>
            国产日韩欧美综合一区| 激情欧美一区| 亚洲综合不卡| 亚洲一区二区在线看| 国产精品色一区二区三区| 午夜精品亚洲| 性欧美video另类hd性玩具| 国产欧美高清| 欧美mv日韩mv国产网站app| 久久午夜羞羞影院免费观看| 亚洲丰满在线| 日韩天堂在线观看| 国产日韩av一区二区| 免费久久精品视频| 欧美日韩国产精品一区二区亚洲| 一区二区三区精品国产| 在线亚洲自拍| 在线观看国产一区二区| 亚洲靠逼com| 国产日产亚洲精品| 91久久精品一区二区别| 国产精品久久久久久久午夜片 | 国产欧美精品va在线观看| 久久精品网址| 欧美日韩国产二区| 久久久久久一区二区三区| 欧美成人伊人久久综合网| 亚洲欧美日韩久久精品| 久久久久国产免费免费| 在线亚洲伦理| 久久久久一区| 欧美一区二区在线播放| 男男成人高潮片免费网站| 午夜精品短视频| 免费欧美视频| 久久精品国产99| 欧美日韩视频在线第一区| 久久久亚洲国产美女国产盗摄| 欧美精品亚洲精品| 米奇777在线欧美播放| 国产精品高潮呻吟久久| 亚洲电影免费在线观看| 国产综合色精品一区二区三区| 亚洲免费观看视频| 最新高清无码专区| 久久精品亚洲一区二区| 午夜精品影院| 国产精品久久国产精品99gif| 欧美激情精品久久久久久大尺度 | 国内自拍一区| 亚洲综合日韩中文字幕v在线| 亚洲伦伦在线| 免费不卡欧美自拍视频| 久久综合伊人77777麻豆| 国产精品免费看| 一区二区三区视频观看| 一区二区久久| 欧美日韩国产高清| 亚洲片国产一区一级在线观看| 在线观看亚洲一区| 久久精品夜色噜噜亚洲aⅴ| 欧美一区二区三区在线| 国产久一道中文一区| 亚洲一区二区日本| 香港久久久电影| 国产精品免费一区豆花| 亚洲一区二区在线观看视频| 亚洲欧美日韩中文播放| 国产精品羞羞答答| 亚洲主播在线观看| 久久精品国产99| 国产综合欧美| 免费不卡在线观看| 亚洲黄色在线| 亚洲一区二区视频在线| 国产精品高精视频免费| 亚洲一二三区在线| 久久精品一区二区| 在线免费高清一区二区三区| 久久综合免费视频影院| 91久久久国产精品| 亚洲午夜精品一区二区| 国产精品亚洲аv天堂网| 午夜精品成人在线视频| 六月丁香综合| 一本色道88久久加勒比精品| 欧美日韩另类一区| 亚洲欧美制服中文字幕| 狼人社综合社区| 亚洲免费av片| 国产精品美女久久久久久久| 欧美一级成年大片在线观看| 久久综合九色综合欧美狠狠| 亚洲精品久久久久久下一站 | 欧美日韩国产综合视频在线观看中文 | 亚洲视频免费看| 久久亚洲欧美国产精品乐播| 91久久久久久久久| 欧美三区在线视频| 久久激情五月激情| 亚洲精品一区二区网址| 欧美怡红院视频| 亚洲高清免费在线| 国产精品久久久久aaaa九色| 久久久国产精品亚洲一区| 91久久嫩草影院一区二区| 亚洲欧美一区二区精品久久久| 伊人狠狠色j香婷婷综合| 欧美色精品天天在线观看视频| 欧美一站二站| 亚洲视频大全| 亚洲国产美女| 久久久久久久国产| 亚洲午夜视频在线观看| 影音先锋欧美精品| 国产精品一区二区三区观看| 欧美激情中文不卡| 久久婷婷国产麻豆91天堂| 亚洲精品在线观| 欧美成人免费va影院高清| 午夜日韩电影| 一本久道久久久| 亚洲第一在线综合在线| 国产欧美精品在线播放| 欧美女同在线视频| 蜜臀av一级做a爰片久久| 欧美一区二区视频在线观看2020| 亚洲免费成人| 亚洲日本va午夜在线影院| 鲁大师成人一区二区三区 | 亚洲欧洲日韩综合二区| 国产视频在线观看一区二区| 欧美日韩在线影院| 欧美电影专区| 蜜桃久久av| 另类综合日韩欧美亚洲| 久久久综合精品| 欧美在线精品免播放器视频| 亚洲视频一二| 亚洲视频在线观看| 妖精成人www高清在线观看| 91久久视频| 亚洲日本成人在线观看| 亚洲破处大片| 日韩一本二本av| av成人国产| 亚洲网站视频| 亚洲在线日韩| 午夜日韩av| 欧美在线亚洲| 久久裸体视频| 狼人社综合社区| 欧美成va人片在线观看| 欧美国产欧美综合 | 久久国产婷婷国产香蕉| 欧美一区二视频在线免费观看| 午夜精品视频| 久久久久久久久久久久久女国产乱| 久久精品日韩| 欧美成年网站| 欧美视频中文一区二区三区在线观看 | 欧美v日韩v国产v| 亚洲国产日韩欧美在线图片 | 久久综合一区| 亚洲欧洲免费视频| 99精品久久久| 欧美一级一区| 欧美国产日韩精品| 国产精品s色| 国内欧美视频一区二区| 亚洲欧洲一区二区天堂久久| 一本色道久久综合狠狠躁篇的优点 | 国产精品久久久久久久久动漫| 国产精品视频久久一区| 国内不卡一区二区三区| 亚洲日韩视频| 午夜欧美精品| 欧美激情国产日韩| 亚洲一区三区电影在线观看| 久久只精品国产| 欧美色综合网| 伊人久久亚洲影院| 亚洲一区在线免费| 蜜臀久久99精品久久久久久9 | 亚洲一级片在线看| 美女日韩欧美| 国产精品网站在线播放| 亚洲欧洲在线视频| 欧美在线视频一区二区| 亚洲精品国偷自产在线99热| 亚洲一区二区三区中文字幕在线 | 麻豆久久婷婷| 国产精品夜色7777狼人| 日韩亚洲欧美在线观看| 久久男人av资源网站| 在线视频日韩精品| 欧美成人在线免费视频| 国产有码一区二区| 亚洲欧美日本国产有色| 亚洲国产精品福利|