#include #include #include #include #include #define REQUEST SIGRTMIN #define GRANT SIGRTMIN+1 #define DONE SIGRTMIN+2 void usage () { printf ("usage: lock pid\n"); exit (1); } volatile int granted = 0; pid_t server; void grant_handler (int sig, siginfo_t * info, void * unused) { if ((info->si_code != SI_NOINFO) && (info->si_code <= 0)) { if (info->si_pid == server) granted = 1; } } int main (int argc, char * argv[]) { struct sigaction act; if ((argc != 2) || (sscanf (argv[1], "%d", (int*)&server) != 1)) usage (); sigemptyset (&act.sa_mask); act.sa_flags = SA_SIGINFO; act.sa_sigaction = grant_handler; if (sigaction (GRANT, &act, NULL) < 0) { perror ("sigaction"); return 1; } printf ("%d Trying to get lock\n", (int)getpid ()); if (kill (server, REQUEST) < 0) { perror ("kill"); printf ("%d: Can't send REQUEST signal\n", (int)getpid ()); return 1; } while (granted == 0) { /* Schlafen bis ein Signal eintrifft. sleep (100) tuts auch */ select (0, NULL, NULL, NULL, NULL); } printf ("%d: GRANT signal received\n", (int)getpid()); sleep (5); printf ("%d: Sending DONE signal\n", (int)getpid ()); if (kill (server, DONE) < 0) { perror ("kill"); printf ("%d: Can't send DONE signal\n", (int)getpid ()); return 1; } printf ("%d: Exiting\n", (int)getpid ()); return 0; }