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




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


#ifdef __SVR4 p.pfd = (-1); p.pid = 0; p.in_bytes = p.out_bytes = 0;

/* Открыть master side пары pty (еще есть slave) */ if((p.pfd = open( "/dev/ptmx", O_RDWR)) < 0 ){ /* Это клонируемый STREAMS driver. * Поскольку он клонируемый, то есть создающий новое псевдоустройство * при каждом открытии, то на master-стороне может быть только * единственный процесс! */ perror( "Open /dev/ptmx" ); goto err; }

# ifdef notdef /* Сделать права доступа к slave-стороне моими. */ if( grantpt (p.pfd) < 0 ){ perror( "grantpt"); exit(errno); } # endif /* Разблокировать slave-сторону псевдотерминала: позволить первый open() для нее */ if( unlockpt(p.pfd) < 0 ){ perror( "unlockpt"); exit(errno); }

/* Получить и записать имя нового slave-устройства-файла. */ strcpy( p.line, ptsname(p.pfd));

#else register i; char c; struct stat st;

p.pfd = (-1); p.pid = 0; p.in_bytes = p.out_bytes = 0;

strcpy( p.line, "/dev/ptyXX" );

for( c = 'p'; c <= 's'; c++ ){ p.line[ strlen("/dev/pty") ] = c; p.line[ strlen("/dev/ptyp")] = '0'; if( stat(p.line, &st) < 0 ) goto err; for(i=0; i < 16; i++){ p.line[ strlen("/dev/ptyp") ] = "0123456789abcdef" [i] ; if((p.pfd = open( p.line, O_RDWR )) >= 0 ){ p.line[ strlen("/dev/") ] = 't'; return p; } } } #endif err: return p; } /* Ведение статистики по вызовам script */ void write_stat( in_bytes, out_bytes, time_here , name, line, at ) long in_bytes, out_bytes; time_t time_here; char *name; char *line; char *at; { FILE *fplog; struct flock lock;

if((fplog = fopen( LOGFILE, "a" )) == NULL ) return;

lock.l_type = F_WRLCK; lock.l_whence = 0; lock.l_start = 0; lock.l_len = 0; /* заблокировать весь файл */ fcntl ( fileno(fplog), F_SETLKW, &lock );

fprintf( fplog, "%s (%s) %ld bytes_in %ld bytes_out %ld secs %s %s %s", PP.command, Reason, in_bytes, out_bytes, time_here, name, line, at ); fflush ( fplog );

lock.l_type = F_UNLCK; lock.l_whence = 0; lock.l_start = 0; lock.l_len = 0; /* разблокировать весь файл */ fcntl ( fileno(fplog), F_SETLK, &lock );




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