Commit | Line | Data |
d9d8d8de |
1 | #!/usr/bin/perl |
2 | eval 'exec /usr/bin/perl -S $0 ${1+"$@"}' |
5f05dabc |
3 | if $running_under_some_shell; |
d9d8d8de |
4 | |
5 | require 'sys/ipc.ph'; |
6 | require 'sys/msg.ph'; |
7 | |
8 | $| = 1; |
9 | |
10 | $mode = shift; |
11 | die "usage: ipcmsg {r|s}\n" unless $mode =~ /^[rs]$/; |
12 | $signal = ($mode eq "s"); |
13 | |
14 | $id = semget(0x1234, 1, ($signal ? 0 : &IPC_CREAT) | 0644); |
15 | die "Can't get semaphore: $!\n" unless defined($id); |
16 | print "semaphore id: $id\n"; |
17 | |
18 | if ($signal) { |
19 | while (<STDIN>) { |
20 | print "Signalling\n"; |
21 | unless (semop($id, 0, pack("sss", 0, 1, 0))) { |
22 | die "Can't signal semaphore: $!\n"; |
23 | } |
24 | } |
25 | } |
26 | else { |
27 | $SIG{'INT'} = $SIG{'QUIT'} = "leave"; |
28 | for (;;) { |
29 | unless (semop($id, 0, pack("sss", 0, -1, 0))) { |
30 | die "Can't wait for semaphore: $!\n"; |
31 | } |
32 | print "Unblocked\n"; |
33 | } |
34 | } |
35 | |
36 | &leave; |
37 | |
38 | sub leave { |
39 | if (!$signal) { |
40 | $x = semctl($id, 0, &IPC_RMID, 0); |
41 | if (!defined($x) || $x < 0) { |
42 | die "Can't remove semaphore: $!\n"; |
43 | } |
44 | } |
45 | exit; |
46 | } |