aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMattias Andrée <maandree@operamail.com>2014-06-13 19:41:59 +0200
committerMattias Andrée <maandree@operamail.com>2014-06-13 19:41:59 +0200
commitf5488d30433ab9b73a1dc10c677996646a39ab7c (patch)
tree5871415d6d5106a580fbbfbbeda0a754413d3f1e
parentm + syv mqueue (diff)
downloadcmdipc-f5488d30433ab9b73a1dc10c677996646a39ab7c.tar.gz
cmdipc-f5488d30433ab9b73a1dc10c677996646a39ab7c.tar.bz2
cmdipc-f5488d30433ab9b73a1dc10c677996646a39ab7c.tar.xz
add semaphore
Signed-off-by: Mattias Andrée <maandree@operamail.com>
-rwxr-xr-xsrc/cmdipc41
1 files 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)