Вспомогательный код для UNIX
Заголовочный файл etcp.h
Почти все программы в этой книге начинаются с заголовочного файла etcp. h (листинг П1.1). Он подключает и другие необходимые файлы, в том числе skel. h (листинг П2.1), а также определения некоторых констант, типов данных и прото-типов.
Листинг П1.1. Заголовочный файл etcp, h
1 #ifndef _ETCP_H_
2 #define _ЕТСР_Н_
3 /* Включаем стандартные заголовки. */
4 #include <errno.h>
5 #include <stdlib.h>
6 #include <unistd.h>
7 #include <stdio.h>
8 #include <stdarg.h>
9 #include <string.h>
10 #include <netdb.h>
11 #include <signal.h>
12 #include <fcntl.h>
13 #include <sys/socket.h>
14 #include <sys/wait.h>
15 #include <sys/time.h>
16 #include <sys/resource.h>
17 #include <sys/stat.h>
18 #include <netinet/in.h>
19 #include <arpa/inet.h>
20 #include "skel.h"
21 #define TRUE 1
22 #define FALSE 0
23 #define NLISTEN 5 /* Максимальное число ожидающих соединений. */
24 #define NSMB 5 /* Число буферов в разделяемой памяти. */
25 #tdefine SMBUFSZ256/* Размер буфера в разделяемой памяти. */
26 extern char *program_name; /* Для сообщений об ошибках. */
27 #ifdef _SVR4
28 #define bzero(b,n) memset( ( b ), 0, ( n ) )
29 #endif
30 typedef void ( *tofunc_t ) ( void * ) ;
31 void error( int, int, char*, ... );
32 int readn( SOCKET, char *, size_t );
33 int readvrect SOCKET, char *, size_t ) ;
34 int readcrlf( SOCKET, char *, size_t ) ;
35 int readline( SOCKET, char *, size_t ) ;
36 int tcp_server( char *, char * };
37 int tcp_client ( char *, char * ) ;
38 int udp_server ( char *, char * } ;
39 int udp_client( char *, char *, struct sockaddr_in * );
40яяяяяяя int tselect( int, fd_set *, fd_set *, fd_set *);
41яяяяяяя unsigned int timeout( tofunc_t, void *, int );
42яяяяяяя void untimeout( unsigned int );
43яяяяяяя void init_smb( int ) ;
44яяяяяяя void *smballoc( void ) ;
45яяяяяяя void smbfree( void * ) ;
46яяяяяяя void smbsendf SOCKET, void * );
47яяяяяяя void *smbrecv( SOCKET ) ;
48яяяяяяя void set_address ( char *, char *, struct sockaddr_in *', char *яяяяяяяяяя ) ;
49яяяяяяя #endifя /* _ETCP_H_ */
”гЄжЁп daemon
”гЄжЁп daemon, Є®в®а п ЁбЇ®«м§®ў ў Їа®Ја ¬¬Ґ tcpmux, ўе®¤Ёв ў бв ¤ авго ЎЁЎ«Ё®вҐЄг, Ї®бв ў«пҐ¬го б бЁб⥬®© BSD. „«п бЁб⥬ SVR4 ЇаЁў®¤Ёвбп ўҐабЁп, ⥪бв Є®в®а®© Ї®Є § ў «ЁбвЁЈҐ Џ1.2.
‹ЁбвЁЈ Џ1.2. ”гЄжЁп daemon
daemon.б
1яяяяяя int daemon( int nocd, int noclose )
2яяяяяяяяя (
3яяяяяя struct rlimit rlim;
4яяяяяя pid_t pid;
5яяяяяя int i;
6яяяяяя mask( 0 );яяя /* ЋзЁбвЁвм ¬ бЄг б®§¤ Ёп д ©«®ў. */
7яяяяяя /* Џ®«гзЁвм ¬ ЄбЁ¬ «м®Ґ зЁб«® ®вЄалвле д ©«®ў. */
8яяяяяя if ( getrlimit( RLIMIT_NOFILE, &rlim ) < 0 )
9яяяяяяяяяяяяяяя error( 1, errno, "getrlimit failed" );
10яяяя /* ‘в вм «Ё¤Ґа®¬ бҐббЁЁ, Ї®вҐапў ЇаЁ н⮬ гЇа ў«пойЁ© вҐа¬Ё «... */
11яяяя pid = fork();
12яяяя if ( pid < 0 )
13яяяяяяяяяяяяя return -1;
14яяяя if ( pid != 0 )
15яяяяяяяяяяяяя exit( 0 ) ;
16яяяя setsid();
17яяяя /* ... Ё Ј а вЁа®ў вм, зв® Ў®«миҐ ҐЈ® Ґ Ўг¤Ґв. */
18яяяя signal( SIGHUP, SIG_IGN );
19яяяя pid = fork(};
20яяяя if ( pid < 0 )
21яяяяяяяяяяяяя return -1;
22яяяя if ( pid != 0 )
23яяяяяяяяяяяяя exit( 0 );
24яяяя * ‘¤Ґ« вм ⥪гйЁ¬ Є®аҐў®© Є в «®Ј, ҐҐ «Ё Ґ вॡ®ў «®бм ®Ўа ⮥ */
25яяяя if ( !nocd )
26яяяяяяяяяяяяя chdir( "/" ) ;
27яяяя /*
28яяяя * …б«Ё б Ґ Їа®бЁ«Ё нв®Ј® Ґ ¤Ґ« вм, § Єалвм ўбҐ д ©«л.
29яяяя * ‡ ⥬ ЇҐаҐ Їа ўЁвм stdin, stdout Ё stderr
30яяяя * /dev/null.
31яяяя */
32яяяя if (!noclose }
33яяяя {
34яяяя #if 0 /* ‡ ¬ҐЁвм 1 ¤«п § ЄалвЁп ўбҐе д ©«®ў. */
35яяяя if ( rlim.rlim_max == RLIM_INFINITY )
3яяяяяяяяяяяяяяя rlim.rlim_max = 1024;
37яяяя for ( i = 0; i < rlim.rlim_max; i++ )
38яяяяяяяяяяяяя close( i );
39яяяя endif
40яяяя i = open( "/dev/null", 0_RDWR );
41яяяя f ( i < 0 )
42яяяяяяяяяяяяя return -1;
43яяяя up2( i, 0 ) ;
44яяяя up2( i, 1 };
45яяяя up2( i, 2 );
46яяяя f ( i > 2 )
47яяяяяяяяяяяяя close( i ) ;
48яяяя }
49яяяя return 0;
50яяяя }
”гЄжЁп signal
‚ нв®© ЄЁЈҐ 㦥 гЇ®¬Ё «®бм, зв® ў ҐЄ®в®але ўҐабЁпе UNIX дгЄжЁп s ignal ॠ«Ё§®ў ®б®ўҐ ᥬ вЁЄЁ Ґ ¤Ґ¦ле бЁЈ «®ў. ‚ в Є®¬ б«гз Ґ ¤«п Ї®«г票п ᥬ вЁЄЁ ¤Ґ¦ле бЁЈ «®ў б«Ґ¤гҐв ЁбЇ®«м§®ў вм дгЄжЁо sigaction. —в®Ўл Ї®ўлбЁвм ЇҐаҐ®бЁ¬®бвм, Ґ®Ўе®¤Ё¬® ॠ«Ё§®ў вм signal б Ї®¬®ймо sigaction («ЁбвЁЈ Џ1.3)
‹ЁбвЁЈ Џ 1.3. ”гЄжЁп signal
signal. c
/*яя signalяя -я ¤Ґ¦ пя ўҐабЁп ¤«пя SVR4я Ё ҐЄ®в®але ¤агЈЁеяяяяяяя бЁб⥬.яя */
1яяяяяя typedef void sighndlr_t(яя intяя );
2яяяяяя sighndlr_tяя *signal(яя intяя sig,яя sighndlr_tяя *hndlrяя )
3яяяяяя {
4яяяяяяяяяяяяяяя struct sigaction act;
5яяяяяяяяяяяяяяя struct sigaction xact;
6яяяяяяяяяяяяяяя act.sa_handler = hndlr;
7яяяяяяяяяяяяяяя act.sa_flags =0;
8яяяяяяяяяяяяяяя sigemptyset( &act.sa_mask );
9яяяяяяяяяяяяяяя if ( sigaction( sig, &act, &xact ) < 0 )
10яяяяяяяяяяяяяяяяяяя return SIG_ERR;
11яяяяяяяяяяяяя return xact.sa_handler;
12яяяя }
| | |