DF-3017 / p3.c
#include <stdio.h> #include <string.h> #include <fcntl.h> #include <unistd.h> #include <errno.h> #include <time.h> #include <sys/uio.h> static void put64(void *p, size_t o, unsigned long v){memcpy((unsigned char*)p+o,&v,8);} int main(void){ unsigned char img[320]; memset(img,0,sizeof(img)); put64(img,168,0x40000000UL); /* si_ops as iov[10].len */ put64(img,184,0x10000UL); put64(img,232,0x21UL); put64(img,32,0x40001000UL); /* junk base */ put64(img,40,0x0000010000000000UL); /* filler len */ int pfd[2]; pipe(pfd); close(pfd[0]); int i; struct timespec a,b; clock_gettime(CLOCK_MONOTONIC,&a); for(i=0;i<100000;i++){ errno=0; ssize_t r=writev(pfd[1],(struct iovec*)img,20); if(i<2 || r!=-1){printf("iter%d: r=%zd errno=%d (%s)\n",i,r,errno,strerror(errno));} if(r!=-1)break; } clock_gettime(CLOCK_MONOTONIC,&b); printf("100k EPIPE writevs in %ld ms\n",(b.tv_sec-a.tv_sec)*1000+(b.tv_nsec-a.tv_nsec)/1000000); return 0; } |