From 45633dbe15fd23b17a975eb4d9c231d22a67ac00 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Thu, 16 Aug 2007 15:23:21 +0000 Subject: [PATCH] Risistemata versione del programma di esempio di {{{splice}}}, funziona solo su kernel che la supportano (Ubuntu 32bit pare di no...) --- fileadv.tex | 39 +++++++++++++++++++++++++++++++-------- img/splice_copy.dia | Bin 0 -> 2010 bytes sockctrl.tex | 24 +++++++++++++++--------- sources/splicecp.c | 32 +++++++++++++++----------------- 4 files changed, 61 insertions(+), 34 deletions(-) create mode 100644 img/splice_copy.dia diff --git a/fileadv.tex b/fileadv.tex index 1581fbb..a7851b6 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -2963,16 +2963,39 @@ l'argomento in sez.~\ref{sec:ipc_unix}). Dal punto di vista concettuale allora l'oggetto \textsl{buffer in kernel space}. Così se per una \textit{pipe} o una \textit{fifo} il buffer viene utilizzato -(come illustrato in fig.~\ref{fig:ipc_pipe_singular}) come area di memoria -dove appoggiare i dati che vengono trasferiti da un capo all'altro della -stessa, creando un meccanismo di comunicazione fra processi, nel caso di -\func{splice} il buffer viene usato o come fonte dei dati che con saranno -scritti su un file, o come destinazione dei dati che vengono letti da un file. - - - +come area di memoria dove appoggiare i dati che vengono trasferiti da un capo +all'altro della stessa (vedi fig.~\ref{fig:ipc_pipe_singular}) per creare un +meccanismo di comunicazione fra processi, nel caso di \funcd{splice} il buffer +viene usato o come fonte dei dati che saranno scritti su un file, o come +destinazione dei dati che vengono letti da un file. La funzione infatti è una +interfaccia generica che consente di trasferire dati da un buffer ad un file o +viceversa; il suo prototipo, accessibile solo avendo definito +\macro{\_GNU\_SOURCE},\footnote{ovviamente, essendo come detto la funzione + totalmente specifica di Linux, essa non è prevista da nessuno standard e + deve essere evitata se si vogliono scrivere programmi portabili.} è: +\begin{functions} + \headdecl{fcntl.h} + \funcdecl{} + + Trasferisce dati da un file verso una pipe o viceversa. + \bodydesc{La funzione restituisce il numero di byte trasferiti in caso di + successo e $-1$ in caso di errore, nel qual caso \var{errno} assumerà uno + dei valori: + \begin{errlist} + \item[\errcode{EAGAIN}] si è impostata la modalità non bloccante su + \param{out\_fd} e la scrittura si bloccherebbe. + \item[\errcode{EINVAL}] i file descriptor non sono validi, o sono bloccati + (vedi sez.~\ref{sec:file_locking}), o \func{mmap} non è disponibile per + \param{in\_fd}. + \item[\errcode{EIO}] si è avuto un errore di lettura da \param{in\_fd}. + \item[\errcode{ENOMEM}] non c'è memoria sufficiente per la lettura da + \param{in\_fd}. + \end{errlist} + ed inoltre \errcode{EBADF} e \errcode{EFAULT}. + } +\end{functions} diff --git a/img/splice_copy.dia b/img/splice_copy.dia new file mode 100644 index 0000000000000000000000000000000000000000..5c57b6f3682d7a93fb0cf5ff80384137a518d022 GIT binary patch literal 2010 zcmV<02POC)iwFP!000001MOX1Z`(E$eb28jTwvIMgceCrqUt8aI&9d(fIX~x8U{nQ zXj`i+8IqjDeb{dwNhxux4?B@WHOgq9X)M$CiuAqb9+Jn*hmZH0V06pk#E-)3F$BhV z#KJ}7`Qhq%{O9LiuITvV&BX`Lci;1WtJvL)_&dTxJi8vR({%fOGP%3E1HnFV(Ec88-?zMU61GP;>#+IcA+=UTIKB) zQ4qzWTQ|5Kzgx=3c#@l$9N9Txd+V;)JZA2fdea7fI8GDOTNW41Znjb4^CszjTWV5c zNBn%!CU2GSM&at_-H+zG?3VHi2U}G)TI(d;xbeyl%YOLS1ld3!KoLTGFo;7P!!~XB zFeWc|H}BV7(676=Uw3{o+eUF3yM9`BIgg@%xnbrtjd!fMpJd?%Jj70Qt3@xCews#S z?tke9$#Xi8U4G2AmuBuN_Px`Id(@)F%AN0}>)HLO;WB^-fv1la1DN^S_vY``PyBhn zs(R>$Y3q1+Fu(7{eDM>M2!D8c%ZSOW)s_&CGQ!BqOUP>Hdn`E!O$u1QNx^xk^dlu*BKOIW>DF1+SRC+QB(fl8_Nb~Ofk-DMh#@^^^^eMU@AD9W} zCBAn({@pkpo??f%F^-O<@!3X?K|}z(gvAb*A*Igvd|tF2^SgJ$RlpwX+cvp0fMb)X z&0(KhLSP}%%p(ifX10jpu*@5}>5_CHp`_fc$Kut(^qTprby{!R0K_?d&}QD|QS7n! zTvrTWkOCy)X8w|ObT_M@s^{x)H6Bb3sn9q#VEf!amnNV}vjg(%Fh!0`DKL3<5b;xO zcC_f!bMgZh%dAeASC=rK*?syXV_=>!sBOkr0(ya|Fk>uWKv_f}5e0=%TUHdaVa}vt zAkL7bLYuk|RL($;+7%|NTYt-z-e1PwHFMSzB(84O5QS-#M{#|$bT@vm7wl{o`+|e8 zyYVPV_kwhAh|Dbfl)dVnNdZ4&XJEckP zTdLV+7d0F8QL*hq#pVezpo$H3#qO_SBVDftQm@%p9*4jAA*(3cq%A7(StN%HtPqzl zpL=6V0231bPkBu>p(UWnFr0>fIA>pHvJ)@rT19;?64zn_lQ*CzEl7soH0wsjKW5@1 zPwL~zDEY5^?In%_9!>q#a~66tH;$vb<~eiD@+@HC>U3{VfeblqU7j7kh8`DD81fY2 zd7hN&@53vjHOGg%UZs&(gyX*)Ugm*Y3Yv;HMz_rI2GxGLmkDQW>K%1 zMb+>pyDbF4ORRL!!vKy$xDVoxDMWx6;)!LDri3F5XS{-)NG%3gCN?GJ<#@F7TtQ z2_h*@R<3Jm*DqbV-&E;tE&YQWDV0i_c(`WzW1ClQH0Ayrj7^ay!>HWRF4d*GuhLzN zMqRlFt8Rj=MVGde=ctr7*}y)MH;K~PkG`qYw{jB)SmzW@R5m%Oamv|(7CC8=)3+5l zwb3~7$-p-eIYH9J%7~$M4g#oHIK+ZoktqU%P;B!HbRhI<%ffF@u4s{6U44oI@6E1` z7{~e$&9MfzsS2%5CVq;c3Gxapu!#^c?~@xG)YPD)LFs%jYE&8`D%o9VJ=B7dC8v1! zK$&a+$#D3R(1mMg>iPS28kq)b9@GTcy*-bFO~) ze`>)_Xa&^p$Wm--CON>lEy5k>xRGLzqJWq-MAB3dG@1 /* error definitions and routines */ #include /* standard I/O library */ #include /* C strings library */ -#include -#include +#include /* file characteristics constants and functions */ +#include /* primitive system data types */ +#include "macros.h" /* * Function and globals definitions */ void usage(void); /* Help printing routine */ - /* * Main program */ @@ -89,7 +89,7 @@ int main(int argc, char *argv[]) usage(); } /* open pipe, input and output file */ - if (pipe(pipefd) == -1) { + if (pipe(pipefd) == -1) { perror("Cannot create buffer pipe"); exit(EXIT_FAILURE); } @@ -98,45 +98,43 @@ int main(int argc, char *argv[]) printf("Input error %s on %s\n", strerror(errno), argv[optind]); exit(EXIT_FAILURE); } - out_fd = open(argv[optind+1], O_CREAT|O_RDWR, 0644); + out_fd = open(argv[optind+1], O_CREAT|O_RDWR|O_TRUNC, 0644); if (out_fd < 0) { printf("Cannot open %s, error %s\n", argv[optind+1], strerror(errno)); exit(EXIT_FAILURE); } /* copy loop */ - printf("Size %d\n", size); + debug("Size %d\n", size); while (1) { nread = splice(in_fd, NULL, pipefd[1], NULL, size, 0); - printf("read %d bytes\n", nread); + debug("read %d bytes\n", nread); if (nread == 0) break; if (nread < 0) { if (errno == EINTR) { continue; } else { perror("read error"); - exit(EXIT_FAILURE); + exit(EXIT_FAILURE); } } do { - nwrite = splice(pipefd[0], NULL, out_fd, NULL, nread, 0); - printf("write %d bytes\n", nwrite); + nwrite = splice(pipefd[0], NULL, out_fd, NULL, nread, 0); + debug("write %d bytes\n", nwrite); if (nwrite == 0) continue; if (nwrite < 0) { if (errno == EINTR) continue; - } else { - perror("write error"); - exit(EXIT_FAILURE); + else { + perror("write error"); + exit(EXIT_FAILURE); + } } nread -= nwrite; - printf("left %d bytes", nread); + debug("left %d bytes\n", nread); } while (nread); } return EXIT_SUCCESS; } - - - /* * routine to print usage info and exit */ -- 2.30.2