Portál AbcLinuxu, 14. července 2025 05:01
listen(...,...); listen(...,...);tak všechno funguje v pořadí daném filedescriptory. Když zkusím použít select() takhle:
FD_ZERO(&fd_read); FD_SET(sockfd, &fd_read); FD_SET(rootsockfd, &fd_read); select(2,&fd_read, NULL, NULL, NULL); if (FD_ISSET(sockfd,&fd_read)) { printf("Normal socket ready.\n"); } else { printf("Root socket ready.\n"); }nic se nestane a „server“ se zasekne a už se nedostane k accept(). Zajímavé ovšem je, že „klient“ odešle to co má a skončí. Otázka zní: Jak funguje select()? Vycházel jsem z referenční příručky GNU C library (http://www.gnu.org/software/libc/manual/), kde mají ukázky podobným stylem. (Zdrojáky v příloze)
Řešení dotazu:
První argument select(2) není počet deskriptorů v poli deskriptorů, ale číslo nejvyššího deskriptoru navýšené o 1.
Prakticky ve vašem programu čekáte na čtecí událost nad prázdnou množinou deskriptorů, která tedy nikdy nenastane. Deskriptor 0 a 1 má totiž již standardní vstup a standardní výstup.
select(FD_SETSIZE,&fd_read, NULL, NULL, NULL);to vyřešilo, díky!
Proč tam asi tak ten první argument vůnec je?To by mě mimochodem docela zajímalo.
To byla řečnická otázka. Ale jestli chcete odpověď:
Právě proto, že pole deskriptorů jsou skutečná pole a jádro je prochází lineárně. Vzhledem k tomu, že deskriptory mají obvykle malé číslo, tak je hloupost procházet všech INT_MAX prvků, když z nich většina je nevyplněná.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.