# Include < Sys / Types. h >
# Include < Sys / Stat. h >
# Include < Fcntl. h >
# Include " Ourhdr. h "
# Include " Error. c "
# Include " F10.17.c "
Static Void Lockabyte ( Const Char * , Int , Off_t );
Int Lock_reg ( Int FD, Int CMD, Int Type, off_t offset, Int Whence, off_t Len)
{
Struct Flock Lock ;
Lock . L_type = Type; /* F_rdlck, f_wrlck, f_unlck */
Lock . L_start = Offset; /* Byte offset, relative to l_whence */
Lock . L_whence = Whence; /* Seek_set, seek_cur, seek_end */
Lock . L_len = Len; /* Bytes (0 means to EOF) */
Return (Fcntl (FD, CMD, & Lock ));
}
Int Main ( Void )
{
Int FD;
Pid_t PID;
/* Create a file and write two bytes to it */
If (FD = Creat ( " Templock " , File_mode )) < 0 )
Err_sys ( " Create Error " );
If (Write (FD, " AB " , 2 ) ! = 2 )
Err_sys ( " Write Error " );
Tell_wait ();
If (PID = Fork ()) < 0 )
Err_sys ( " Fork Error " );
Else If (PID = 0 ){ /* Child */
Lockabyte ( " Child " , FD, 0 );
Tell_parent (getppid ());
Wait_parent ();
Lockabyte ( " Child " , FD, 1 );
} Else {
Lockabyte ( " Parent " , FD, 1 );
Tell_child (PID );
Wait_child ();
Lockabyte ( " Parent " , FD, 0 );
}
Exit ( 0 );
}
Static Void Lockabyte ( Const Char * Name, Int FD, off_t offset)
{
If (Writew_lock (FD, offset, seek_set, 1 ) < 0 )
Err_sys ( " % S: writew_lock Error " , Name );
Printf ( " % S: got the lock, byte % d \ n " , Name, offset );
}