diff options
| -rwxr-xr-x | src/cmdipc | 50 |
1 files changed, 48 insertions, 2 deletions
@@ -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) |
