📄 worker.ec
字号:
#include <stdio.h>#include <ctype.h>#include <sys/types.h>#include <sys/ipc.h>#include "../incl/bank.h"#define MAX_WORKERS 32#define WORKERID_NET 77 #define NTBKHOLD "/etc/ntbkhold"int shmid;int wknum = 0;WORKER *worker_table; /* Global but used only in this file */init_worker(){ int i,j,k; char buf[ 100 ]; char comment[10][80]; FILE *fp; WORKER wks[ MAX_WORKERS ]; /* Read file ntbkhold */ memset( ( char * )wks, '\0', sizeof( wks ) ); fp = fopen( (char *) getfname ( WORKDIR, NTBKHOLD ), "r" ); if ( fp == NULL ) { WriteLog ( LOGFILE, "fopen(ntbkhold) return NULL" ); return( -1 ); } i = j = 0; while( i< MAX_WORKERS && fgets( buf, 80, fp ) != NULL ) { if ( buf[ 0 ] == '#' || buf[ 0 ] == '\n' ) { strcpy( comment[j++], buf ); continue; /* 注释行空行 */ } sscanf( buf, "%s%s%s%s%s%s%s\n", wks[ i ].manager_id, wks[ i ].worker_4, wks[ i ].worker_5, wks[ i ].passwd, wks[ i ].rank, wks[ i ].note, wks[ i ].active ); wks[ i ].busy[ 0 ] = '0'; wks[ i ].active[ 0 ] = '0'; i++; } fclose( fp ); fp = fopen( (char *)getfname(WORKDIR,"/etc/ntbkhold"), "w" ); if ( fp == NULL ) { WriteLog(LOGFILE, " ntbkhold not found! \n" ); return( -1 ); } for( k=0; k<j; k++ ) fwrite( comment[ k ], 1, strlen( comment[k] ), fp ); for( k=0; k<i; k++ ) fprintf( fp, "%s\t%s\t\t%s\t\t%s\t%s\t%s\t%s\n", wks[ k ].manager_id, wks[ k ].worker_4, wks[ k ].worker_5, wks[ k ].passwd, wks[ k ].rank, wks[ k ].note, wks[ k ].active ); fclose( fp ); if ( i == 0 ) { WriteLog ( LOGFILE, "no worker can be used" ); return( -1 ); } wknum = i; /* Creat share memory worker table */ worker_table = ( WORKER * ) creat_shm ( SHMFILE_NET, WORKERID_NET, wknum * sizeof(WORKER) ); if ( worker_table == NULL ) { WriteLog ( LOGFILE, "creat_shm() return NULL" ); return( -1 ); } memcpy( (char * )worker_table, ( char * )wks, wknum * sizeof(WORKER) ); return( 0 );}alloc_worker( manager_id, wk )char *manager_id;WORKER **wk;{ int i = 0; int flag; while( i < wknum ) { WriteLog( LOGFILE,"worker_table[%d].busy is [%s]!",i,worker_table[ i ].busy); WriteLog( LOGFILE,"worker_table[%d].active is [%s]!",i,worker_table[ i ].active); WriteLog( LOGFILE,"worker_table[%d].manager_id is [%s]!",i,worker_table[ i ].manager_id); if ( worker_table[ i ].busy[ 0 ] == '0' && worker_table[ i ].active[ 0 ] == '1' && !strcmp( manager_id, worker_table[ i ].manager_id ) ) { (* wk) = & worker_table[ i ]; (* wk) -> busy[ 0 ] = '1'; flag = 1; break; } i++; } prtb (); if ( flag == 1 ) { WriteLog ( LOGFILE, "alloc worker successful!"); return( 0 ); } else { WriteLog ( LOGFILE, "woker hasn't sign on or no free worker now!"); return( -1 ); }}free_worker( wk )WORKER *wk;{ if ( wk != NULL ) wk->busy[ 0 ] = '0'; return( 0 );}get_worker( wk, worker_4 )WORKER **wk;char * worker_4;{ int i = 0; while( i < wknum ) { if ( !memcmp( worker_4, worker_table[ i ].worker_4, 4 ) ) {WriteLog(LOGFILE,"worker_4: %s worker_table[i].worker_4:%s;",worker_4,worker_table[i].worker_4); (* wk) = & worker_table[ i ]; return( 0 ); } i++; } prtb (); WriteLog ( LOGFILE, "worker[%s] is not in ntbkhold", worker_4 ); }close_worker( ){ return( rm_shm( SHMFILE_NET, WORKERID_NET ) );}prtb(){ int i; while( i < wknum ) { printf("%s %s %s %s %s %s %s %s\n", worker_table[ i ].manager_id, worker_table[ i ].worker_4, worker_table[ i ].worker_5, worker_table[ i ].passwd, worker_table[ i ].rank, worker_table[ i ].note, worker_table[ i ].active, worker_table[ i ].busy); i++; } printf("\n");}worker_on( wk )WORKER **wk;{ int i = 0; while( i < wknum ) { (* wk) = & worker_table[ i ]; (* wk) -> active[ 0 ] = '1'; i++; } prtb (); WriteLog ( LOGFILE, "signon worker successful!"); return ( 0 );}worker_off( wk )WORKER **wk;{ int i = 0; while( i < wknum ) { (* wk) = & worker_table[ i ]; (* wk) -> active[ 0 ] = '0'; i++; } prtb (); WriteLog ( LOGFILE, "signoff worker successful!"); return ( 0 );}Get_worker( manager_id,worker_4, wk )char *manager_id;char *worker_4;WORKER **wk;{ int i = 0; int flag = 0; while(1) { while( i < wknum ) { if ( worker_table[ i ].busy[ 0 ] == '0' && worker_table[ i ].active[ 0 ] == '1' && !strcmp( manager_id, worker_table[ i ].manager_id )&& !strcmp(worker_4,worker_table[i].worker_4)) { (* wk) = & worker_table[ i ]; (* wk) -> busy[ 0 ] = '1'; flag = 1; break; } i++; } if(flag == 1) break; } prtb ();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -