log.pll
来自「一个嵌入式系统的C代码」· PLL 代码 · 共 135 行
PLL
135 行
PROGRAM Log(INPUT, OUTPUT);
{-----------------------------------------------------------}
{ PURPOSE: ACME Application Log program }
{ - uses shared memory to record/observe what }
{ users are doing with ACME application }
{ - does not implement mutual exclusion at all }
{ - will try to read when there is nothing to read }
{ AUTHOR: David Jones }
{ DATE: 1-MAY-95 Created }
{-----------------------------------------------------------}
CONST
NUM_ELEMENTS = 5; {** NUMBER OF ELEMENTS TO BE STORED **}
QUEUE_START = 3; {** INDEX WHERE QUEUE STARTS **}
VAR
logging_shm, process_id, action_id : INTEGER;
{*******************************************}
{ ConnectIPC }
{ - either create and initialise shared }
{ memory, OR }
{ - connect to the existing shared memory }
{ - shm id is returned as VAR parameter }
{*******************************************}
FUNCTION ConnectIPC : INTEGER;
VAR
result, count : INTEGER;
BEGIN
logging_shm := SYSTEM( SHR_OPEN, 'myshm' );
IF logging_shm <= 0 THEN
BEGIN
logging_shm := SYSTEM( SHR_CREATE, 'myshm', NUM_ELEMENTS*2+QUEUE_START );
{** Initialise shared memory data structure **}
result := SYSTEM( SHR_WRITE, logging_shm, 0, 0 );
result := SYSTEM( SHR_WRITE, logging_shm, 1, QUEUE_START );
result := SYSTEM( SHR_WRITE, logging_shm, 2, QUEUE_START );
FOR count := QUEUE_START TO NUM_ELEMENTS*2+QUEUE_START-1 DO
BEGIN
result := SYSTEM( SHR_WRITE, logging_shm, count, -1 )
END
END;
ConnectIPC := 1;
END;
{********************************************}
{ CloseIPC }
{ - free up any IPC primitives used }
{********************************************}
PROCEDURE CloseIPC;
VAR
result : INTEGER;
BEGIN
result := SYSTEM( SHR_CLOSE, logging_shm );
END;
{********************************************}
{ ReadAction }
{ - get from shm the next process, action }
{ ids, if there are some there }
{********************************************}
PROCEDURE ReadAction;
VAR
get, result : INTEGER;
BEGIN
{ get location of next id pair to read }
get := SYSTEM( SHR_READ, logging_shm, 2 );
process_id := SYSTEM( SHR_READ, logging_shm, get );
action_id := SYSTEM( SHR_READ, logging_shm, get+1 );
{* check to see if there was something to read *}
IF ( process_id = -1 ) OR ( action_id = -1 ) THEN
BEGIN
Writeln( '*********' );
Writeln( '**ERROR** log is empty' );
Writeln( '*********' )
END
ELSE
BEGIN
{* delete pair from log *}
result := SYSTEM( SHR_WRITE, logging_shm, get, -1 );
result := SYSTEM( SHR_WRITE, logging_shm, get+1, -1 );
{* update get location *}
get := get + 2;
IF get = NUM_ELEMENTS * 2 + QUEUE_START THEN
get := QUEUE_START;
result := SYSTEM( SHR_WRITE, logging_shm, 2, get )
END
END;
PROCEDURE DoAction;
VAR
temp : INTEGER;
BEGIN
WHILE 1 = 1 DO
BEGIN
Writeln( 'enter to read next element' );
Read( temp# );
ReadAction;
Write( 'Process ', process_id# );
IF action_id = 1 THEN
Writeln( ' created new user.' );
IF action_id = 2 THEN
Writeln( ' deleted user.' );
IF action_id = 3 THEN
Writeln( ' viewed users.' );
IF action_id = 4 THEN
Writeln( ' exited application.' )
END
END;
BEGIN
IF ConnectIPC = 1 THEN
DoAction
ELSE
Writeln( '** UNABLE TO OPEN IPC PRIMITIVES **' )
END.
{------------------------------ EOF -----------------------------}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?