aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xsrc/cmdipc50
1 files changed, 48 insertions, 2 deletions
diff --git a/src/cmdipc b/src/cmdipc
index 36a02ee..fcb6aae 100755
--- a/src/cmdipc
+++ b/src/cmdipc
@@ -39,7 +39,8 @@ parser = ArgParser('System V and POSIX IPC from the command line',
'%s -B [<options>] <threshold> [enter]' % sys.argv[0],
'%s -B [<options>] -r' % sys.argv[0],
'%s -L [<options>] [shared [un]lock]' % sys.argv[0],
- '%s -L [<options>] exclusive [un]lock' % sys.argv[0]]),
+ '%s -L [<options>] exclusive [un]lock' % sys.argv[0],
+ '%s -R [<options>] [<message>]' % sys.argv[0]]),
None, None, True, ArgParser.standard_abbreviations())
@@ -65,7 +66,7 @@ parser.add_argumentless(['-X', '--mutex'], 0, 'Use mutex (1 semap
parser.add_argumentless(['-C', '--condition'], 0, 'Use condition (3 semaphores)')
parser.add_argumentless(['-B', '--barrier'], 0, 'Use barrier (2 semaphores)')
parser.add_argumentless(['-L', '--shared-lock'], 0, 'Use shared lock (3 semaphores)')
-#parser.add_argumentless(['-R', '--rendezvous'], 0, 'Use rendezvous (non-primitive)')
+parser.add_argumentless(['-R', '--rendezvous'], 0, 'Use rendezvous (2 semaphores, 1 mqueue)')
parser.parse()
@@ -310,6 +311,51 @@ try:
print('Invalid command given', file = sys.stderr)
sys.exit(1)
+ elif parser.opts['--rendezvous'] is not None:
+ key, flags, mode, size, timeout = [None, None, None], 0, 0o600, 2048, None
+ if parser.opts['--nonblocking'] is not None: timeout = 0
+ if parser.opts['--key'] is not None: key = parser.opts['--key'][0]
+ if parser.opts['--create'] is not None: flags = sysv_ipc.IPC_CREAT
+ if parser.opts['--exclusive'] is not None: flags = sysv_ipc.IPC_CREAT | sysv_ipc.IPC_EXCL
+ if parser.opts['--mode'] is not None: mode = int(parser.opts['--mode'][0], 8)
+ if parser.opts['--size'] is not None: size = int(parser.opts['--size'][0])
+ if parser.opts['--timeout'] is not None: timeout = float(parser.opts['--timeout'][0])
+ block = timeout != 0
+ if key[0] is not None:
+ key = [int(k) for k in key.split('.')]
+ m = sysv_ipc.Semaphore(key[0], flags, mode, 1)
+ i = sysv_ipc.Semaphore(key[1], flags, mode, 0)
+ q = sysv_ipc.MessageQueue(key[2], flags, mode, size)
+ if key[0] is None:
+ print('key: %i.%i.%i' % (m.key, i.key, q.key))
+ nocmd = False
+ if len(parser.files) > 0:
+ send_message = ' '.join(parser.files).encode('utf-8')
+ m.P(timeout)
+ if i.value == 0:
+ i.V()
+ m.V()
+ q.send(send_message, block, 1)
+ (recv_message, _type) = q.receive(block, 2)
+ else:
+ i.P(timeout)
+ m.V()
+ (recv_message, _type) = q.receive(block, 1)
+ q.send(send_message, block, 2)
+ print('length: %i' % len(recv_message))
+ sys.stdout.buffer.write(recv_message)
+ sys.stdout.buffer.write(b'\n')
+ sys.stdout.buffer.flush()
+ elif key[0] is not None:
+ nocmd = True
+ if parser.opts['--remove'] is not None:
+ m.remove()
+ i.remove()
+ q.remove()
+ elif nocmd:
+ print('Invalid command given', file = sys.stderr)
+ sys.exit(1)
+
else:
print('No command given', file = sys.stderr)
sys.exit(1)