Хрестоматия по программированию на Си в Unix




Системные вызовы и взаимодействие с UNIX. Хрестоматия по программированию на Си в Unix - стр. 6


for(f=1; f < ac; f++ ) if((fds[nopen].fd = open(av[f], O_RDONLY)) < 0 ){ fprintf(stderr, "Can't read %s\n", av[f] ); continue; } else { FD_SET(fds[nopen].fd, &set ); /* учесть в маске */ maxfd = max(maxfd, fds[nopen].fd ); strncpy(fds[nopen].name, av[f], sizeof(fds[0].name) - 1); nopen++; }

if( nopen == 3 ){ fprintf(stderr, "Nothing is opened\n"); exit(1); }

FD_SET(fdin, &set); /* учесть stdin */ maxfd = max(maxfd, fdin ); nopen -= 2; /* stdout и stderr не участвуют в select */ timeout.tv_sec = 10; /* секунд */ timeout.tv_usec = 0; /* миллисекунд */

/* nfds - это КОЛИЧЕСТВО первых дескрипторов, которые надо * просматривать. Здесь можно использовать * nfds = NOFILE; (кол-во ВСЕХ дескрипторов ) * или nfds = maxfd+1; (кол-во = номер последнего+1) * ( +1 т.к. нумерация fd идет с номера 0, а количество - с 1). */ nfds = maxfd + 1; while( nopen ){

rset = set; rtimeout = timeout; /* копируем, т.к. изменятся */ /* опрашивать можно FIFO-файлы, терминалы, pty, socket-ы, stream-ы */

nready = select( nfds, &rset, NULL, NULL, &rtimeout );

/* Если вместо &rtimeout написать NULL, то ожидание будет * бесконечным (пока не собьют сигналом) */ if( nready <= 0 ){ /* ничего не поступило */ fprintf(stderr, "Timed out, nopen=%d\n", nopen); continue; } /* опрос готовых дескрипторов */ for(f=0; f < nfds; f++ ) if( FD_ISSET(f, &rset)){ /* дескриптор f готов */ int n;

/* Вызов FIONREAD позволяет запросить * число байт готовых к передаче * через дескриптор. */ if(ioctl(f, FIONREAD, &n) < 0) perror("FIONREAD"); else printf("%s have %d bytes.\n", N(f), n);

if((n = read(f, buf, sizeof buf)) <= 0 ){ eof: FD_CLR(f, &set); /* исключить */ close(f); nopen--; fprintf(stderr, "EOF in %s\n", N(f));

} else {

fprintf(stderr, "\n%d bytes from %s:\n", n, N(f)); write(fdout, buf, n); if( n == 4 && !strncmp(buf, "end\n", 4)) /* ncmp, т.к. buf может не оканчиваться \0 */ goto eof; } } } exit(0); }

© Copyright А. Богатырев, 1992-95
Си в UNIX

| |




Содержание  Назад  Вперед