From f5488d30433ab9b73a1dc10c677996646a39ab7c Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Fri, 13 Jun 2014 19:41:59 +0200 Subject: add semaphore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- src/cmdipc | 41 +++++++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/src/cmdipc b/src/cmdipc index 28cd4ab..9ea9c71 100755 --- a/src/cmdipc +++ b/src/cmdipc @@ -28,7 +28,8 @@ import posix_ipc parser = ArgParser('System V and POSIX IPC from the command line', '\n'.join(['%s -Q [options]' % sys.argv[0], '%s -Q [options] send [--] message' % sys.argv[0], - '%s -Q [options] receive' % sys.argv[0]]), + '%s -Q [options] receive' % sys.argv[0], + '%s -S [options] [p|v|z]' % sys.argv[0]]), None, None, True, ArgParser.standard_abbreviations()) @@ -38,12 +39,15 @@ parser.add_argumented (['-k', '--key'], 0, 'KEY', 'The key (SysV) or parser.add_argumented (['-m', '--mode'], 0, 'OCTAL', 'The mode for the item') parser.add_argumented (['-s', '--size'], 0, 'SIZE', 'Maximum size for messages') parser.add_argumented (['-t', '--type'], 0, 'TYPE', 'Message type') +parser.add_argumented (['-d', '--delta'], 0, 'DELTA', 'Semaphore value increment') +parser.add_argumented (['-i', '--initial'], 0, 'VALUE', 'Initial semaphore value') +parser.add_argumented (['-b', '--timeout'], 0, 'SECS', 'Semaphore V/Z timeout, in seconds') parser.add_argumentless(['-r', '--remove'], 0, 'Remove unit') parser.add_argumentless(['-n', '--nonblocking'], 0, 'Do not block, exit with 2 if busy') parser.add_argumentless(['-c', '--create'], 0, 'Create item') parser.add_argumentless(['-x', '--exclusive'], 0, 'Create exclusive item') parser.add_argumentless(['-Q', '--mqueue'], 0, 'Use message queue') -#parser.add_argumentless(['-S', '--semaphore'], 0, 'Use semaphore') +parser.add_argumentless(['-S', '--semaphore'], 0, 'Use semaphore') #parser.add_argumentless(['-M', '--shm'], 0, 'Use shared memory') @@ -59,12 +63,12 @@ try: if parser.opts['--mqueue'] is not None: key, flags, mode, size, type = None, 0, 0o600, 2048, None block = parser.opts['--nonblocking'] is None - if parser.opts['--key'] is not None: key = int(parser.opts['--key'][0]) + if parser.opts['--key'] is not None: key = int(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['--type'] is not None: type = int(parser.opts['--type'][0]) + 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['--type'] is not None: type = int(parser.opts['--type'][0]) q = sysv_ipc.MessageQueue(key, flags, mode, size) if key is None: print('key: %i' % q.key) @@ -89,6 +93,31 @@ try: elif nocmd: print('Invalid command given', file = sys.stderr) sys.exit(1) + + elif parser.opts['--semaphore'] is not None: + key, flags, mode, initial, timeout, delta = None, 0, 0o600, 0, None, 1 + if parser.opts['--key'] is not None: key = int(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['--initial'] is not None: initial = int(parser.opts['--initial'][0]) + if parser.opts['--timeout'] is not None: timeout = float(parser.opts['--timeout'][0]) + if parser.opts['--delta'] is not None: delta = int(parser.opts['--delta'][0]) + s = sysv_ipc.Semaphore(key, flags, mode, initial) + if key is None: + print('key: %i' % s.key) + nocmd = False + if (len(parser.files) == 1) and (parser.files[0] == 'p'): s.P(timeout, delta) + elif (len(parser.files) == 1) and (parser.files[0] == 'v'): s.V(delta) + elif (len(parser.files) == 1) and (parser.files[0] == 'z'): s.Z(timeout) + elif key is not None: + nocmd = True + if parser.opts['--remove'] is not None: + s.remove() + elif nocmd: + print('Invalid command given', file = sys.stderr) + sys.exit(1) + else: print('No command given', file = sys.stderr) sys.exit(1) -- cgit v1.2.3-70-g09d2