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/shm.ph'; |
7 | |
8 | $| = 1; |
9 | |
10 | $mode = shift; |
11 | die "usage: ipcshm {r|s}\n" unless $mode =~ /^[rs]$/; |
12 | $send = ($mode eq "s"); |
13 | |
14 | $SIZE = 32; |
15 | $id = shmget(0x1234, $SIZE, ($send ? 0 : &IPC_CREAT) | 0644); |
e5d73d77 |
16 | die "Can't get shared memory: $!\n" unless defined($id); |
17 | print "shared memory id: $id\n"; |
d9d8d8de |
18 | |
19 | if ($send) { |
20 | while (<STDIN>) { |
21 | chop; |
22 | unless (shmwrite($id, pack("La*", length($_), $_), 0, $SIZE)) { |
23 | die "Can't write to shared memory: $!\n"; |
24 | } |
25 | } |
26 | } |
27 | else { |
28 | $SIG{'INT'} = $SIG{'QUIT'} = "leave"; |
29 | for (;;) { |
30 | $_ = <STDIN>; |
31 | unless (shmread($id, $_, 0, $SIZE)) { |
32 | die "Can't read shared memory: $!\n"; |
33 | } |
34 | $len = unpack("L", $_); |
35 | $message = substr($_, length(pack("L",0)), $len); |
36 | printf "[%d] %s\n", $len, $message; |
37 | } |
38 | } |
39 | |
40 | &leave; |
41 | |
42 | sub leave { |
43 | if (!$send) { |
44 | $x = shmctl($id, &IPC_RMID, 0); |
45 | if (!defined($x) || $x < 0) { |
46 | die "Can't remove shared memory: $!\n"; |
47 | } |
48 | } |
49 | exit; |
50 | } |