18c0693f

Вспомогательный код для 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яяяя }

| | |