| 
									
										
										
										
											1998-08-10 19:42:37 +00:00
										 |  |  | \section{\module{fcntl} --- | 
					
						
							| 
									
										
										
										
											1999-03-02 16:37:17 +00:00
										 |  |  |          The \function{fcntl()} and \function{ioctl()} system calls} | 
					
						
							| 
									
										
										
										
											1998-07-23 17:59:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-03-02 16:37:17 +00:00
										 |  |  | \declaremodule{builtin}{fcntl} | 
					
						
							| 
									
										
										
										
											1999-03-02 17:03:42 +00:00
										 |  |  |   \platform{Unix} | 
					
						
							| 
									
										
										
										
											1998-07-23 17:59:49 +00:00
										 |  |  | \modulesynopsis{The \function{fcntl()} and \function{ioctl()} system calls.} | 
					
						
							| 
									
										
										
										
											2000-04-03 20:13:55 +00:00
										 |  |  | \sectionauthor{Jaap Vermeulen}{} | 
					
						
							| 
									
										
										
										
											1998-07-23 17:59:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-11-28 07:26:15 +00:00
										 |  |  | \indexii{UNIX@\UNIX}{file control} | 
					
						
							|  |  |  | \indexii{UNIX@\UNIX}{I/O control} | 
					
						
							| 
									
										
										
										
											1994-05-19 09:09:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-03-13 10:03:32 +00:00
										 |  |  | This module performs file control and I/O control on file descriptors. | 
					
						
							| 
									
										
										
										
											1998-03-12 05:33:40 +00:00
										 |  |  | It is an interface to the \cfunction{fcntl()} and \cfunction{ioctl()} | 
					
						
							| 
									
										
										
										
											2001-05-09 21:09:57 +00:00
										 |  |  | \UNIX{} routines. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | All functions in this module take a file descriptor \var{fd} as their | 
					
						
							|  |  |  | first argument.  This can be an integer file descriptor, such as | 
					
						
							|  |  |  | returned by \code{sys.stdin.fileno()}, or a file object, such as | 
					
						
							| 
									
										
										
										
											2001-11-28 07:48:32 +00:00
										 |  |  | \code{sys.stdin} itself, which provides a \method{fileno()} which | 
					
						
							|  |  |  | returns a genuine file descriptor. | 
					
						
							| 
									
										
										
										
											1994-05-19 09:09:50 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | The module defines the following functions: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-12 05:33:40 +00:00
										 |  |  | \begin{funcdesc}{fcntl}{fd, op\optional{, arg}} | 
					
						
							| 
									
										
										
										
											2001-11-28 07:48:32 +00:00
										 |  |  |   Perform the requested operation on file descriptor \var{fd} (file | 
					
						
							|  |  |  |   objects providing a \method{fileno()} method are accepted as well). | 
					
						
							| 
									
										
										
										
											1998-03-12 05:33:40 +00:00
										 |  |  |   The operation is defined by \var{op} and is operating system | 
					
						
							| 
									
										
										
										
											2001-05-09 21:09:57 +00:00
										 |  |  |   dependent.  These codes are also found in the \module{fcntl} | 
					
						
							|  |  |  |   module. The argument \var{arg} is optional, and defaults to the | 
					
						
							|  |  |  |   integer value \code{0}.  When present, it can either be an integer | 
					
						
							|  |  |  |   value, or a string.  With the argument missing or an integer value, | 
					
						
							|  |  |  |   the return value of this function is the integer return value of the | 
					
						
							|  |  |  |   C \cfunction{fcntl()} call.  When the argument is a string it | 
					
						
							|  |  |  |   represents a binary structure, e.g.\ created by | 
					
						
							|  |  |  |   \function{struct.pack()}. The binary data is copied to a buffer | 
					
						
							|  |  |  |   whose address is passed to the C \cfunction{fcntl()} call.  The | 
					
						
							|  |  |  |   return value after a successful call is the contents of the buffer, | 
					
						
							|  |  |  |   converted to a string object.  The length of the returned string | 
					
						
							|  |  |  |   will be the same as the length of the \var{arg} argument.  This is | 
					
						
							|  |  |  |   limited to 1024 bytes.  If the information returned in the buffer by | 
					
						
							|  |  |  |   the operating system is larger than 1024 bytes, this is most likely | 
					
						
							|  |  |  |   to result in a segmentation violation or a more subtle data | 
					
						
							|  |  |  |   corruption. | 
					
						
							| 
									
										
										
										
											2000-08-02 20:53:51 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   If the \cfunction{fcntl()} fails, an \exception{IOError} is | 
					
						
							| 
									
										
										
										
											1998-03-12 05:33:40 +00:00
										 |  |  |   raised. | 
					
						
							| 
									
										
										
										
											1994-05-19 09:09:50 +00:00
										 |  |  | \end{funcdesc} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-12 05:33:40 +00:00
										 |  |  | \begin{funcdesc}{ioctl}{fd, op, arg} | 
					
						
							|  |  |  |   This function is identical to the \function{fcntl()} function, except | 
					
						
							| 
									
										
										
										
											1994-05-19 09:09:50 +00:00
										 |  |  |   that the operations are typically defined in the library module | 
					
						
							| 
									
										
										
										
											2002-06-14 01:58:19 +00:00
										 |  |  |   \refmodule{termios}. | 
					
						
							| 
									
										
										
										
											1994-05-19 09:09:50 +00:00
										 |  |  | \end{funcdesc} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-12 05:33:40 +00:00
										 |  |  | \begin{funcdesc}{flock}{fd, op} | 
					
						
							| 
									
										
										
										
											2001-11-28 07:48:32 +00:00
										 |  |  | Perform the lock operation \var{op} on file descriptor \var{fd} (file | 
					
						
							|  |  |  |   objects providing a \method{fileno()} method are accepted as well). | 
					
						
							| 
									
										
										
										
											1998-04-03 06:54:27 +00:00
										 |  |  | See the \UNIX{} manual \manpage{flock}{3} for details.  (On some | 
					
						
							|  |  |  | systems, this function is emulated using \cfunction{fcntl()}.) | 
					
						
							| 
									
										
										
										
											1996-06-26 19:20:33 +00:00
										 |  |  | \end{funcdesc} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-01-25 00:36:54 +00:00
										 |  |  | \begin{funcdesc}{lockf}{fd, operation, | 
					
						
							|  |  |  |     \optional{len, \optional{start, \optional{whence}}}} | 
					
						
							|  |  |  | This is essentially a wrapper around the \function{fcntl()} locking | 
					
						
							|  |  |  | calls.  \var{fd} is the file descriptor of the file to lock or unlock, | 
					
						
							|  |  |  | and \var{operation} is one of the following values: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \begin{itemize} | 
					
						
							|  |  |  | \item \constant{LOCK_UN} -- unlock | 
					
						
							|  |  |  | \item \constant{LOCK_SH} -- acquire a shared lock | 
					
						
							|  |  |  | \item \constant{LOCK_EX} -- acquire an exclusive lock | 
					
						
							|  |  |  | \end{itemize} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | When \var{operation} is \constant{LOCK_SH} or \constant{LOCK_EX}, it | 
					
						
							|  |  |  | can also be bit-wise OR'd with \constant{LOCK_NB} to avoid blocking on | 
					
						
							|  |  |  | lock acquisition.  If \constant{LOCK_NB} is used and the lock cannot | 
					
						
							|  |  |  | be acquired, an \exception{IOError} will be raised and the exception | 
					
						
							|  |  |  | will have an \var{errno} attribute set to \constant{EACCES} or | 
					
						
							|  |  |  | \constant{EAGAIN} (depending on the operating system; for portability, | 
					
						
							| 
									
										
										
										
											2001-11-28 07:48:32 +00:00
										 |  |  | check for both values).  On at least some systems, \constant{LOCK_EX} | 
					
						
							|  |  |  | can only be used if the file descriptor refers to a file opened for | 
					
						
							|  |  |  | writing. | 
					
						
							| 
									
										
										
										
											2001-01-25 00:36:54 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | \var{length} is the number of bytes to lock, \var{start} is the byte | 
					
						
							|  |  |  | offset at which the lock starts, relative to \var{whence}, and | 
					
						
							|  |  |  | \var{whence} is as with \function{fileobj.seek()}, specifically: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \begin{itemize} | 
					
						
							|  |  |  | \item \constant{0} -- relative to the start of the file | 
					
						
							|  |  |  |       (\constant{SEEK_SET}) | 
					
						
							|  |  |  | \item \constant{1} -- relative to the current buffer position | 
					
						
							|  |  |  |       (\constant{SEEK_CUR}) | 
					
						
							|  |  |  | \item \constant{2} -- relative to the end of the file | 
					
						
							|  |  |  |       (\constant{SEEK_END}) | 
					
						
							|  |  |  | \end{itemize} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The default for \var{start} is 0, which means to start at the | 
					
						
							|  |  |  | beginning of the file.  The default for \var{length} is 0 which means | 
					
						
							|  |  |  | to lock to the end of the file.  The default for \var{whence} is also | 
					
						
							|  |  |  | 0. | 
					
						
							| 
									
										
										
										
											1996-10-11 17:43:34 +00:00
										 |  |  | \end{funcdesc} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-05-19 09:09:50 +00:00
										 |  |  | Examples (all on a SVR4 compliant system): | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-02-13 06:58:54 +00:00
										 |  |  | \begin{verbatim} | 
					
						
							| 
									
										
										
										
											2001-05-09 21:09:57 +00:00
										 |  |  | import struct, fcntl | 
					
						
							| 
									
										
										
										
											1994-05-19 09:09:50 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | file = open(...) | 
					
						
							| 
									
										
										
										
											2001-05-09 21:09:57 +00:00
										 |  |  | rv = fcntl(file, fcntl.F_SETFL, os.O_NDELAY) | 
					
						
							| 
									
										
										
										
											1994-05-19 09:09:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-05-09 21:09:57 +00:00
										 |  |  | lockdata = struct.pack('hhllhh', fcntl.F_WRLCK, 0, 0, 0, 0, 0) | 
					
						
							|  |  |  | rv = fcntl.fcntl(file, fcntl.F_SETLKW, lockdata) | 
					
						
							| 
									
										
										
										
											1998-02-13 06:58:54 +00:00
										 |  |  | \end{verbatim} | 
					
						
							| 
									
										
										
										
											1998-03-12 05:33:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-04-11 21:33:47 +00:00
										 |  |  | Note that in the first example the return value variable \var{rv} will | 
					
						
							| 
									
										
										
										
											1994-05-19 09:09:50 +00:00
										 |  |  | hold an integer value; in the second example it will hold a string | 
					
						
							| 
									
										
										
										
											1998-04-03 06:54:27 +00:00
										 |  |  | value.  The structure lay-out for the \var{lockdata} variable is | 
					
						
							| 
									
										
										
										
											1998-03-12 05:33:40 +00:00
										 |  |  | system dependent --- therefore using the \function{flock()} call may be | 
					
						
							| 
									
										
										
										
											1996-06-26 19:20:33 +00:00
										 |  |  | better. |