<DIV id=RTEContent>  <DIV id=RTEContent>  <DIV id=RTEContent>  <DIV id=RTEContent>Buna.</DIV>  <DIV>&nbsp;</DIV>  <DIV>Am o intrebare (mai degraba problema) la tema 4 . aio_suspend nu este intrerupt de semnale. </DIV>  <DIV>As apreacia mult un raspuns.</DIV>  <DIV>&nbsp;</DIV>  <DIV>Am facut un program de test, care in threarul principal astepta sa citeasca de la tastatura (printr-un select pe file descriptorul zero 0). Tot in threadul principal(inainte de select, e lansat un aio_read). Apoi creez un thread in care dau un sleep de 1000 de secunde dupa care dau aio_suspend-ul. Cand se citeste de la tastatura ceva, e trimis un semnal catre acel thread prin pthread_kill. Deci eu practic pot trimite semnale de cate ori vreau. Semnalul trimis intreruop usleep (deci nu sleep, ci usleep), dupa care threadul copil logic ajunge la aio_select. Pe acesta insa nu mai reuseste sa il trezeasca. In functia de tratare a semnalului SIGRTMAX e pus un printf("ssssss"), astfel ca se vade ca semanalul
 ajunge. Deci acelasi semnal care intrerupe usleep-ul nu mai reuseste sa intrerupa aio_selectul.</DIV>  <DIV>&nbsp;</DIV>  <DIV>Din codul atastat am mai scos unele secvente care afisatu tid-ul, etc etc, pentru a fi mai lizibil. Dar daca mai adaug si tid-ul curent prin printf-uri, e clar ca threadul primeste semnalul; de altfel, facptul ca usleepul e intrerupt face acest lucru si mai clar. In codul meu initial, aveam defapt 3-4 de usleepuri, pe care le trezeam pe toate cu semanale, fara nici o problema. Le-am scos din codul tirmis tot pentru a fi mai lizibil coul. Dar daca vrei poti adauga acel usleep de mai multe ori unu dupa altul, si prin semnal le vei putea intrerupe pe toate. aio_suspend nu merge in sa intrerupt.</DIV>  <DIV>&nbsp;</DIV>  <DIV>Codul afiseaza</DIV>  <DIV>TASTATURA</DIV>  <DIV>TASTATURA ^^^^^ssssssssssssssssssssssssssssssssssssss&nbsp;&nbsp;&nbsp; </DIV> 
 <DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cand este trimis un semanl</DIV>  <DIV>&nbsp;</DIV>  <DIV>&nbsp;</DIV>  <DIV>apoi </DIV>  <DIV>66666666 inainte de usleep</DIV>  <DIV>777777777 imediat dupa usleep si ininte de a intra in&nbsp; aio_suspend</DIV>  <DIV>7777777777^^^^^^ %d imadiat dupa aio_suspend</DIV>  <DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %d contine codul de eroare a lui aio_suspend, care desi ar treuyi sa fie -1 (daca ar fi intrerupt) e tot timpul 0(ca si cum nu e intrerupt; in fond corect , deoarece semnalelele nu reusesc sa il intrerupa(ceea ce nu mai e corect)).</DIV>  <DIV>&nbsp;</DIV>  <DIV>&nbsp;</DIV>  <DIV>Programul se compileaza cu </DIV>  <DIV>&nbsp;   <DIV style="MARGIN-BOTTOM: 0in">g++ -Wall -g TestD.cpp -o testD -pthread -lrt</DIV>  <DIV
 style="MARGIN-BOTTOM: 0in">&nbsp;</DIV>  <DIV style="MARGIN-BOTTOM: 0in">&nbsp;</DIV>  <DIV style="MARGIN-BOTTOM: 0in">si un exemplu de rulare ar fi:</DIV>  <DIV style="MARGIN-BOTTOM: 0in"></DIV>  <DIV style="MARGIN-BOTTOM: 0in">./testD /home/adrian/adrian.zip 0 90000000</DIV>  <DIV style="MARGIN-BOTTOM: 0in">&nbsp;</DIV>  <DIV style="MARGIN-BOTTOM: 0in">Ca sa astepte&nbsp; mai mult&nbsp; la aio_suspend, fisierul&nbsp; din care se citeste (in caul de fata&nbsp; /home/adrian/adrian.zip) trebuie sa fie&nbsp; mare (eu am facut o arhiva de 92MB)</DIV>  <DIV style="MARGIN-BOTTOM: 0in">dica care sa se si citesca mult 90000000==90.000.000 adica 90MB. Daca e rulat pe fisiere mici sau daca parametru argv[3] e mic de genu 90 (adica se citesc 90 byti)&nbsp; citirea asiun crona se va fi terminat intinte de a ajunge la aio_suspend. Deci tebuie rulat pe fisiere mari si cu parametru mare (92 MB respectiv 90000000).</DIV>  <DIV style="MARGIN-BOTTOM: 0in">&nbsp;</DIV>  <DIV style="MARGIN-BOTTOM:
 0in">&nbsp;</DIV>  <DIV style="MARGIN-BOTTOM: 0in">&nbsp;</DIV>  <DIV style="MARGIN-BOTTOM: 0in">In concluzie, se porneste programulm, si cand afiseaza 66666666 insemana ca a ajuns la usleep. aici, trebuie tastat ceva si ENTEE, , se iese datorita intreruperii SIGRTMAX (se afiseaza ssssssssssssssssssssssss, adica intreruperea a fost tratata), apoi va fi afisat 77777777 adica sa ajuns la aio_suspend. Daca fiserul e mare si argv[3 ] e mare, programul se blocheaza. Daca tastez, se va afisa ssssssssssssssssssssss adica intresuperile snt vazute si tratate, doar ca nu se afiseaza si 7777777777^^^^^^^^-1 adica nu se iese din aio_suspend datorita intreruperilor. Doar dupa ceva timp se va iesi si din aio_suspend adica se afiseaza 7777777777^^^^^^^^0&nbsp; adica s-a iesit din aio_suspend datorita terminarii citirii asincrone.</DIV>  <DIV style="MARGIN-BOTTOM: 0in">&nbsp;</DIV>  <DIV style="MARGIN-BOTTOM: 0in">&nbsp;</DIV>  <DIV style="MARGIN-BOTTOM: 0in">&nbsp;</DIV>  <DIV
 style="MARGIN-BOTTOM: 0in">Nu imi dau seman care e problema (deoarece programul; pare destul de simplu&nbsp; si de clar). Nu imi dau semana de ce usleep este intrerupt iar aio_suspend nu. In alte versiuni, am mai incercat in loc de usleep si cu functii de genul&nbsp; "sigwait"</DIV>  <DIV style="MARGIN-BOTTOM: 0in">, care im i arata ca semanlul ajunge la thread, dar apoi cand ajung si la aio_suspend, acesta nu e trezit de intrerupere, desi aceasta e treatata.</DIV>  <DIV style="MARGIN-BOTTOM: 0in">&nbsp;</DIV>  <DIV style="MARGIN-BOTTOM: 0in">&nbsp;</DIV>  <DIV style="MARGIN-BOTTOM: 0in">&nbsp;</DIV>  <DIV style="MARGIN-BOTTOM: 0in">&nbsp;</DIV>  <DIV style="MARGIN-BOTTOM: 0in">&nbsp;</DIV>  <DIV style="MARGIN-BOTTOM: 0in">Multumesc anticipat </DIV>  <DIV style="MARGIN-BOTTOM: 0in">&nbsp;</DIV>  <DIV style="MARGIN-BOTTOM: 0in">Adrian Nistor</DIV>  <DIV style="MARGIN-BOTTOM: 0in">&nbsp;</DIV>  <DIV style="MARGIN-BOTTOM: 0in">&nbsp;</DIV>  <DIV style="MARGIN-BOTTOM: 0in">CODUL
 ESTE:</DIV>  <DIV style="MARGIN-BOTTOM: 0in">&nbsp;  <div style="MARGIN-BOTTOM: 0in">#include &lt;sys/types.h&gt;<BR>#include &lt;sys/socket.h&gt;<BR>#include &lt;stdio.h&gt;<BR>#include &lt;sys/time.h&gt;<BR>#include &lt;sys/types.h&gt;<BR>#include &lt;unistd.h&gt;<BR>#include &lt;errno.h&gt;<BR>#include &lt;sys/socket.h&gt;<BR>#include &lt;netinet/in.h&gt;<BR>#include &lt;arpa/inet.h&gt;<BR>#include &lt;stdlib.h&gt;<BR>#include &lt;string.h&gt;<BR>#include &lt;vector&gt;<BR>#include &lt;pthread.h&gt;<BR>#include &lt;stdio.h&gt;<BR>#include &lt;semaphore.h&gt;<BR>#include &lt;signal.h&gt;<BR>#include &lt;aio.h&gt;<BR><BR>typedef struct <BR>{<BR>int tid;<BR>}ParametriThread;<BR><BR>extern int errno;<BR>aiocb cb;<BR>pthread_t Fir;<BR>pthread_t FirP;<BR>timespec t;<BR><BR>//./testD /home/adrian/adrian.zip 0 90000000<BR>//g++ -Wall -g TestD.cpp -o testD -pthread -lrt<BR>//===========================<BR><BR>void FunctiaSIGRTMAX(int signum,siginfo_t *info,void
 *param)<BR>{<BR>printf("ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss\n");fflush(stdout);<BR><BR>}<BR>//--------------------------------<BR>void InitilizeazaSigactionSIGRTMAX()<BR>{<BR>struct sigaction semnale;<BR>memset(&amp;semnale,0,sizeof(semnale));<BR>sigset_t masca;<BR>sigemptyset(&amp;masca);//ca nu vreau sa blochez nici un semnal<BR>semnale.sa_flags=SA_SIGINFO;<BR>semnale.sa_mask=masca;<BR>semnale.sa_sigaction=FunctiaSIGRTMAX;<BR>int xxx=sigaction(SIGRTMIN ,&amp;semnale,(struct sigaction*)NULL); <BR>if(xxx==-1)<BR>{<BR>perror("ERR testD.cpp InitilizeazaSigactionSIGRTMAX;la sigaction;NAT\n");<BR>exit(1);<BR>}<BR>}<BR>//-------------------------------------------------------------------------------------------------------------------------------<BR><BR>//=======================<BR>void TrateazaInputTastatura()<BR>{<BR>printf("TASTATURA\n");<BR>int xxx=pthread_kill(Fir,SIGRTMIN); <BR>if(xxx==-1)<BR>{<BR>perror("ERR testD.cpp TrateazaInputTastatura; la
 pthread_kill");<BR>}<BR>char *c;<BR>c=(char*)malloc(1999);<BR>read(STDIN_FILENO,c,1999);<BR>printf("TASTATURA^^^ ");<BR>}<BR>//------------------------------------------------------<BR>void* FunctieThread(void *params)<BR>{<BR>aiocb *cblist[2];<BR>cblist[0]=&amp;cb;<BR>cblist[1]=NULL;<BR>int nr=2; <BR>t.tv_nsec=2000;<BR>t.tv_sec=2000;<BR><BR>int ddd=1999;<BR><BR>printf("666666666\n");<BR>usleep(1000000000);<BR>printf("77777777\n");<BR><BR>int xxx=1999;<BR>xxx=aio_suspend(cblist,nr,&amp;t);<BR>printf("77777777^^^ %d\n",xxx);fflush(stdout);<BR><BR>exit(1);<BR>}<BR><BR>int main(int argc,char*argv[])<BR>{<BR>InitilizeazaSigactionSIGRTMAX();<BR><BR><BR>//variabile pentru conexiune<BR>int soketClientNou;<BR>int clilen;<BR>sockaddr_in cli_addr;<BR>fd_set readFdSet; //fd_set folosit in select()<BR>fd_set tmpFdSet; //fd_set folosit temporar<BR>int fdMax;<BR><BR>//lansare citire<BR>//citirea asincrona<BR>int
 fis1=open(argv[1],O_RDWR);<BR>if(fis1==-1)<BR>{<BR>perror("ERR1");<BR>exit(1);<BR>}<BR><BR>char *undePun1;<BR>undePun1=(char*)malloc(100000000);<BR>memset(undePun1,0,100000000);<BR>memset(&amp;cb,0,sizeof(aiocb));<BR>cb.aio_fildes=fis1;<BR>cb.aio_lio_opcode=LIO_READ;<BR>cb.aio_reqprio=0;<BR>cb.aio_buf=undePun1;<BR>cb.aio_offset=atoi(argv[2]);<BR>cb.aio_nbytes=atoi(argv[3]);<BR>cb.aio_sigevent.sigev_notify=SIGEV_NONE;<BR><BR>int xxx1;<BR>xxx1=aio_read(&amp;cb);<BR>if(xxx1==-1)<BR>{<BR>perror("ERR2");<BR>}<BR><BR>//end lansare citire<BR><BR>//end variabile pentru conexiune<BR><BR>FD_SET(0,&amp;readFdSet);<BR>fdMax = 0;<BR><BR><BR><BR>//lansez thread<BR>ParametriThread firArgs;<BR>firArgs.tid=1999;//defapt poate chiar osa imi trebuiasca vreodta la ceva<BR>int xxx=pthread_create(&amp;Fir, NULL, &amp;FunctieThread, &amp;firArgs);<BR>if(xxx==-1)<BR>{<BR>perror("ERR server.cpp CreazaPoolThreaduri;la crearea threadA;NAT\n");<BR>exit(1);<BR>}<BR><BR>FirP=pthread_self();<BR>//end lansare
 tread<BR><BR><BR>//asteapta comenzi de la tastatura<BR>while(1==1)<BR>{<BR><BR>tmpFdSet =readFdSet; <BR><BR>//selectul , e facut in while pentru a nu fi intrerupt de vrun semnal;daca e intrerupt , reporneste<BR>// nu e cazul aici dar just in case <BR>while (1==1)<BR>{<BR><BR>int nrDescriptoriSchimbati=select(fdMax + 1, &amp;tmpFdSet, NULL, NULL,NULL);//timeout==infinit<BR><BR>if (nrDescriptoriSchimbati == -1 &amp;&amp; errno==EINTR )<BR>{ <BR>continue;<BR>}<BR>if(nrDescriptoriSchimbati == -1 &amp;&amp; errno!=EINTR )<BR>{<BR>perror("ERR server.cpp main; select;NAT");<BR>exit(1);<BR>}<BR>if(nrDescriptoriSchimbati ==0)<BR>{<BR>continue;//a expirat timpul de asteptate<BR>}<BR>if(nrDescriptoriSchimbati&gt;0)<BR>{<BR>break;//chiar am primit ceva <BR>}<BR>}<BR><BR>int i=0;<BR>for(i = 0; i &lt;= fdMax; i++) <BR>{ <BR>if (FD_ISSET(i, &amp;tmpFdSet)) <BR>{ <BR>if(i==0)//adica tastatura<BR>{<BR>TrateazaInputTastatura();<BR>//FD_CLR(0,&amp;readFdSet);<BR>} <BR><BR>}<BR>}
 <BR>}<BR><BR>exit(1);<BR><BR><BR><BR>pthread_join(Fir, NULL);<BR>}<BR><BR><BR></div></DIV></DIV></DIV></DIV></DIV><p>
                <hr size=1>Yahoo! Photos<br> 
Ring in the New Year with <a href="http://us.rd.yahoo.com/mail_us/taglines/photos/*http://pg.photos.yahoo.com/ph//page?.file=calendar_splash.html&.dir=">Photo Calendars</a>. Add photos, events, holidays, whatever.