Chirurgia spinală minim invazivă
Chirurgia spinală minim invazivă oferă pacienților oportunitatea unui tratament eficient, permițându-le o recuperare ultra rapidă și nu în ultimul rând minimizând leziunile induse chirurgical. Echipa noastră utilizează un spectru larg de tehnici minim invazive, din care enumerăm câteva: endoscopia cu variantele ei (transnazală, transtoracică, transmusculară, etc), microscopul operator, abordurile trans tubulare și nu în ultimul rând infiltrațiile la toate nivelurile coloanei vertebrale. www.neurohope.ro |
cum folosesc/accesez un socket intr-un thread (C sub linux)
Last Updated: Jan 25 2011 14:45, Started by
andreim77
, Jan 13 2011 14:15
·
0
#1
Posted 13 January 2011 - 14:15
Problema serioasa:
un client se conecteaza prin socket de tip fisier la un server si ramane conectat intr-un thread adorm client-ul ca sa nu consume resurse in thread-ul copil, cand serverul ii trimite ceva, clientul se trezeste (teoretic ca la mine nu) si ii va semnala procesului tatic sa execute diverse. ideea e ca select nu detecteaza nimic, desi stiu ca primesc informatii pe socket fiindca citesc date din el. Pe scurt e posibil sa detectez ca am date in socket dintr-un proces copil al procesului in care s-a creat socketul? Codul meu: // procesul parinte: void F_StartSocketReading() { pthread_t t; int rc; rc=pthread_create(&t,NULL,F_CheckSocketStatus,&sockfd); if(rc) return; }// functiile din thread-ul din "background" void *F_CheckSocketStatus(void *arg) { while(1) { if(socket_has_data(*((int*)arg))) fprintf(stderr,"\n socket has data\n"); else fprintf(stderr,"\nno data in socket\n"); } } static DM_Boolean socket_has_data(int fd) { fd_set rfds; struct timeval tv; int retval; FD_ZERO(&rfds); FD_SET(fd,&rfds); tv.tv_sec=1; tv.tv_usec=0; [color="#FF0000"]retval=select(1,&rfds,NULL,NULL,NULL);[/color] [b] // asta inseamna ca asteapta pana ceva se intimpla in socket[/b] if (retval) return TRUE; return FALSE; } Edited by andreim77, 13 January 2011 - 14:16. |
#3
Posted 13 January 2011 - 14:33
thread, cum zice cod-ul, rezultat din pthread_create.
E posibil si cu fork, ideea e sa mearga algoritmul, adica select apelat in thread sa detecteze ca socket-ul are date la un moment dat, socket-ul fiind create in alt thread, cel al lui main. |
#4
Posted 13 January 2011 - 16:03
rezolvare se foloseste poll()
static DM_Boolean socket_has_data(int fd) { struct pollfd pfd[1]; int ret; pfd[0].fd=fd; pfd[0].events=POLLIN; ret=poll(pfd,1,-1); if(pfd[0].revents & POLLIN) return TRUE; return FALSE; } Functioneaza si pentru fork() si cu pthread_create() |
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users