|
|
1.1 root 1: .TH SEMOP 2
2: .SH NAME
3: semop \- semaphore operations
4: .SH SYNOPSIS
5: .B #include <sys/types.h>
6: .br
7: .B #include <sys/ipc.h>
8: .br
9: .B #include <sys/sem.h>
10: .PP
11: .nf
12: .B int semop (semid, sops, nsops)
13: .B int semid;
14: .B struct sembuf **sops;
15: .B int nsops;
16: .fi
17: .SH DESCRIPTION
18: .I Semop
19: is used to automatically perform an array of semaphore operations on the
20: set of semaphores associated with the semaphore identifier specified by
21: .IR semid .
22: .I Sops
23: is a pointer to the array of semaphore-operation structures.
24: .I Nsops
25: is the number of such structures in the array.
26: The contents of each structure includes the following members:
27: .PP
28: .RS
29: .ta 8n 20n
30: .nf
31: short sem_num; /\(** semaphore number \(**/
32: short sem_op; /\(** semaphore operation \(**/
33: short sem_flg; /\(** operation flags \(**/
34: .fi
35: .RE
36: .PP
37: Each semaphore operation specified by
38: .I sem_op
39: is performed on the corresponding semaphore specified by
40: .IR semid " and " sem_num .
41: .PP
42: .I Sem_op
43: specifies one of three semaphore operations as follows:
44: .PP
45: .RS 8
46: If
47: .I sem_op
48: is a negative integer, one of the following will occur:
49: .SM
50: \%{ALTER}
51: .IP
52: If semval (see
53: .IR intro (2))
54: is greater than or equal to the absolute value of
55: .IR sem_op ,
56: the absolute value of
57: .I sem_op
58: is subtracted from semval.
59: Also, if
60: .RI ( sem_flg " &"
61: .SM
62: .BR SEM_UNDO\*S )
63: is ``true'', the absolute value of
64: .I sem_op
65: is added to the calling process's semadj value (see
66: .IR exit (2))
67: for the specified semaphore.
68: .IP
69: If semval is less than the absolute value of
70: .I sem_op
71: and
72: .RI ( sem_flg " &"
73: .SM
74: .BR IPC_NOWAIT\*S )
75: is ``true'',
76: .I semop
1.1.1.2 ! root 77: returns immediately.
1.1 root 78: .IP
79: If semval is less than the absolute value of
80: .I sem_op
81: and
82: .RI ( sem_flg " &"
83: .SM
84: .BR IPC_NOWAIT\*S )
85: is ``false'',
86: .I semop
1.1.1.2 ! root 87: increments the semncnt associated with the specified semaphore
1.1 root 88: and suspend execution of the calling process
89: until one of the following conditions occurs.
90: .RS 8
91: .PP
92: Semval becomes greater than or equal to the absolute value of
93: .IR sem_op .
94: When this occurs, the value of semncnt associated with the specified
95: semaphore is decremented, the absolute value of
96: .I sem_op
97: is subtracted from semval and, if
98: .RI ( sem_flg " &"
99: .SM
100: .BR SEM_UNDO\*S )
101: is ``true'', the absolute value of
102: .I sem_op
103: is added to the calling process's semadj value for the specified semaphore.
104: .PP
105: The semid for which the calling process is awaiting action
106: is removed from the system (see
107: .IR semctl (2)).
108: When this occurs,
109: .I errno
110: is set equal to
111: .SM
112: EIDRM\*S,
113: and a value of \-1 is returned.
114: .PP
115: The calling process receives a signal that is to be caught.
116: When this occurs, the value of semncnt associated with the specified
117: semaphore is decremented,
118: and the calling process resumes execution in the manner prescribed in
119: .IR signal (2).
120: .RE
121: .PP
122: If
123: .I sem_op
124: is a positive integer, the value of
125: .I sem_op
126: is added to semval
127: and, if
128: .RI ( sem_flg " &"
129: .SM
130: .BR SEM_UNDO\*S )
131: is ``true'', the value of
132: .I sem_op
133: is subtracted from the calling process's semadj value for the specified
134: semaphore.
135: .SM
136: \%{ALTER}
137: .PP
138: If
139: .I sem_op
140: is zero,
1.1.1.2 ! root 141: one of the following occurs:
1.1 root 142: .SM
143: \%{READ}
144: .IP
145: If semval is zero,
146: .I semop
1.1.1.2 ! root 147: returns immediately.
1.1 root 148: .IP
149: If semval is not equal to zero and
150: .RI ( sem_flg " &"
151: .SM
152: .BR IPC_NOWAIT\*S )
153: is ``true'',
154: .I semop
1.1.1.2 ! root 155: returns immediately.
1.1 root 156: .IP
157: If semval is not equal to zero and
158: .RI ( sem_flg " &"
159: .SM
160: .BR IPC_NOWAIT\*S )
161: is ``false'',
162: .I semop
1.1.1.2 ! root 163: increments the semzcnt associated with the specified semaphore
! 164: and suspends execution of the calling process until
1.1 root 165: one of the following occurs:
166: .RS 8
167: .PP
168: Semval becomes zero, at which time the value of semzcnt associated with the
169: specified semaphore is decremented.
170: .PP
171: The semid for which the calling process is awaiting action
172: is removed from the system.
173: When this occurs,
174: .I errno
175: is set equal to
176: .SM
177: EIDRM\*S,
178: and a value of \-1 is returned.
179: .PP
180: The calling process receives a signal that is to be caught.
181: When this occurs, the value of semzcnt associated with the specified
182: semaphore is decremented,
183: and the calling process resumes execution in the manner prescribed in
184: .IR signal (2).
185: .RE
186: .RE
187: .PP
188: .I Semop
1.1.1.2 ! root 189: fails if one or more of the following are true for any of the semaphore
1.1 root 190: operations specified by
191: .IR sops :
192: .TP 15
193: .TP
194: \s-1\%[EINVAL]\s+1
195: .I Semid
196: is not a valid semaphore identifier.
197: .TP
198: \s-1\%[EFBIG]\s+1
199: .I Sem_num
200: is less than zero or greater than or equal to the number of semaphores
201: in the set associated with
202: .IR semid .
203: .TP
204: \s-1\%[E2BIG]\s+1
205: .I Nsops
206: is greater than the system-imposed maximum.
207: .TP
208: \s-1\%[EACCES]\s+1
209: Operation permission is denied to the calling process (see
210: .IR intro (2)).
211: .TP
212: \s-1\%[EAGAIN]\s+1
213: The operation would result in suspension of the calling process but
214: .RI ( sem_flg " &"
215: .SM
216: .BR IPC_NOWAIT\*S )
217: is ``true''.
218: .TP
219: \s-1\%[ENOSPC]\s+1
220: The limit on the number of individual processes requesting an
221: .SM
222: .B SEM_UNDO
223: would be exceeded.
224: .TP
225: \s-1\%[EINVAL]\s+1
226: The number of individual semaphores for which the calling process
227: requests a
228: .SM
229: .B SEM_UNDO
230: would exceed the limit.
231: .TP
232: \s-1\%[ERANGE]\s+1
233: An operation would cause a semval to overflow the system-imposed limit.
234: .TP
235: \s-1\%[ERANGE]\s+1
236: An operation would cause a semadj value to overflow the
237: system-imposed limit.
238: .TP
239: \s-1\%[EFAULT]\s+1
240: .I Sops
241: points to an illegal address.
242: .PP
243: Upon successful completion, the value of sempid
244: for each semaphore specified in the array pointed to by
245: .I sops
246: is set equal to the process
247: .SM ID
248: of the calling process.
249: .SH RETURN VALUE
250: .RI If " semop
251: returns due to the receipt of a signal, a value of \-1 is returned to the
252: calling process and
253: .I errno
254: is set to
255: .SM
256: \%EINTR\*S.
257: If it returns due to the removal of a
258: .I semid
259: from the system, a value of \-1 is returned and
260: .I errno
261: is set to
262: .SM
263: \%EIDRM\*S.
264: .PP
265: Upon successful completion, the value of semval at the time of the call for the
266: last operation in the array pointed to by
267: .I sops
268: is returned.
269: Otherwise, a value of \-1 is returned and
270: .I errno
271: is set to indicate the error.
272: .SH SEE ALSO
273: exec(2), exit(2), fork(2), intro(2), semctl(2), semget(2).
274: .\" @(#)semop.2 6.2 of 9/6/83
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.