- Error report
- Access to the process environment
- Process handling
- Basic file input/output
- Interfacing with the standard input/output library
- Seeking and truncating
- File statistics
- Locking
- Mapping files into memory
- Operations on file names
- File permissions and ownership
- Operations on file descriptors
- Directories
- Pipes and redirections
- High-level process and redirection management
- Symbolic links
- Polling
- Time functions
- User id, group id
- Internet addresses
- Sockets
- Socket options
- High-level network connection functions
- Host and protocol databases
- Terminal interface
- Filesystem functions
- I/O vectors
- I/O functions
- Temporary file and directory creation
- Signal handling
- User id, group id
- Globbing and shell expansion
- System information
- Additional IP functionality
package core_unix
Module Core_unixSource
This file is a modified version of unixLabels.mli from the OCaml distribution. Many of these functions raise exceptions but do not have a _exn suffixed name.
File descriptor.
Error report
type error = Core_unix__.Import.Unix.error = | E2BIG| EACCES| EAGAIN| EBADF| EBUSY| ECHILD| EDEADLK| EDOM| EEXIST| EFAULT| EFBIG| EINTR| EINVAL| EIO| EISDIR| EMFILE| EMLINK| ENAMETOOLONG| ENFILE| ENODEV| ENOENT| ENOEXEC| ENOLCK| ENOMEM| ENOSPC| ENOSYS| ENOTDIR| ENOTEMPTY| ENOTTY| ENXIO| EPERM| EPIPE| ERANGE| EROFS| ESPIPE| ESRCH| EXDEV| EWOULDBLOCK| EINPROGRESS| EALREADY| ENOTSOCK| EDESTADDRREQ| EMSGSIZE| EPROTOTYPE| ENOPROTOOPT| EPROTONOSUPPORT| ESOCKTNOSUPPORT| EOPNOTSUPP| EPFNOSUPPORT| EAFNOSUPPORT| EADDRINUSE| EADDRNOTAVAIL| ENETDOWN| ENETUNREACH| ENETRESET| ECONNABORTED| ECONNRESET| ENOBUFS| EISCONN| ENOTCONN| ESHUTDOWN| ETOOMANYREFS| ETIMEDOUT| ECONNREFUSED| EHOSTDOWN| EHOSTUNREACH| ELOOP| EOVERFLOW| EUNKNOWNERR of int
Raised by the system calls below when an error is encountered. The first component is the error code; the second component is the function name; the third component is the string parameter to the function, if it has one, or the empty string otherwise.
Representation of Unix system call results
handle_unix_error f runs f () and returns the result. If the exception Unix_error is raised, it prints a message describing the error and exits with code 2.
retry_until_no_eintr f returns f () unless f () fails with EINTR; in which case f () is run again until it raises a different error or returns a value.
Access to the process environment
If you're looking for getenv, that's in the Sys module.
Return the process environment, as an array of strings with the format ``variable=value''. The returned array is empty if the process has special privileges.
Unix.putenv ~key ~data sets the value associated to a variable in the process environment. key is the name of the environment variable, and data its new associated value.
unsetenv name deletes the variable name from the environment.
EINVAL name contained an ’=’ or an '\000' character.
Process handling
val exec :
prog:string ->
argv:string list ->
?use_path:bool ->
?env:env ->
unit ->
Core.never_returnsexec ~prog ~argv ?search_path ?env execs prog with argv. If use_path = true (the default) and prog doesn't contain a slash, then exec searches the PATH environment variable for prog. If env is supplied, it determines the environment when prog is executed.
While not strictly necessary, by convention, the first element in argv should be the name of the file being executed, e.g.:
exec ~prog ~argv:[ prog; arg1; arg2; ...] () val fork_exec :
prog:string ->
argv:string list ->
?preexec_fn:(unit -> unit) ->
?use_path:bool ->
?env:env ->
unit ->
Core.Pid.tfork_exec ~prog ~argv ?preexec_fn ?use_path ?env () forks, calls preexec_fn, and then execs prog with argv in the child process, returning the child PID to the parent. As in exec, by convention, the 0th element in argv should be the program itself.
Since preexec_fn is invoked post-fork but pre-exec, it must:
- not allocate; and
- not call any async-signal-unsafe functions (see man 7 signal)
Violating these constraints may cause the program to deadlock or exhibit undefined behavior.
fork () forks a new process. The return value indicates whether we are continuing in the child or the parent, and if the parent, includes the child's process id.
wait{,_nohang,_untraced,_nohang_untraced} ?restart wait_on is a family of functions that wait on a process to exit (normally or via a signal) or be stopped by a signal (if untraced is used). The wait_on argument specifies which processes to wait on. The nohang variants return None immediately if none of the desired processes has exited yet. If nohang is not used, waitpid will block until one of the desired processes exits.
The non-nohang variants have a restart flag with (default true) that causes the system call to be retried upon EAGAIN|EINTR. The nohang variants do not have this flag because they don't block.
waitpid pid waits for child process pid to terminate, and returns its exit status. waitpid_exn is like waitpid, except it only returns if the child exits with status zero, and raises if the child terminates in any other way.
Execute the given command, wait until it terminates, and return its termination status. The string is interpreted by the shell /bin/sh and therefore can contain redirections, quotes, variables, etc. The result WEXITED 127 indicates that the shell couldn't be executed.
Return the pid of the process.
Return the pid of the parent process.
Return the pid of the parent process, if you're really sure you're never going to be the init process.
Set process group ID of a process.
Return process group ID of a process.
None means the pgid is zero, which cannot be represented as a Pid.t. This happens at least for kernel processes. See ps -ejH for examples.
Get the numeric ID of the current thread, e.g. for identifying it in top(1).
Change the process priority. The integer argument is added to the ``nice'' value. (Higher values of the ``nice'' value mean lower priorities.) Return the new nice value.
Basic file input/output
The abstract type of file descriptors.
File descriptor for standard input.
File descriptor for standard output.
File descriptor for standard standard error.
The flags to UnixLabels.openfile.
type open_flag = Core_unix__.Import.Unix.open_flag = | O_RDONLY(*Open for reading
*)| O_WRONLY(*Open for writing
*)| O_RDWR(*Open for reading and writing
*)| O_NONBLOCK(*Open in non-blocking mode
*)| O_APPEND(*Open for append
*)| O_CREAT(*Create if nonexistent
*)| O_TRUNC(*Truncate to 0 length if existing
*)| O_EXCL(*Fail if existing
*)| O_NOCTTY(*Don't make this dev a controlling tty
*)| O_DSYNC(*Writes complete as `Synchronised I/O data integrity completion'
*)| O_SYNC(*Writes complete as `Synchronised I/O file integrity completion'
*)| O_RSYNC(*Reads complete as writes (depending on O_SYNC/O_DSYNC)
*)| O_SHARE_DELETE(*Windows only: allow the file to be deleted while still open
*)| O_CLOEXEC| O_KEEPEXEC
We can't use with sexp because pa_sexp inserts two copies of the val specs, which leads to a spurious "unused" warning.
file access rights
Open the named file with the given flags. Third argument is the permissions to give to the file if it is created. Return a file descriptor on the named file. Default permissions 0o644.
fcntl_getfl fd gets the current flags for fd from the open-file-descriptor table via the system call fcntl(fd, F_GETFL). See "man fcntl".
fcntl_setfl fd flags sets the flags for fd in the open-file-descriptor table via the system call fcntl(fd, F_SETFL, flags). See "man fcntl". As per the Linux man page, on Linux this only allows append, async, direct, noatime, and nonblock to be set.
Close a file descriptor.
val with_file :
?perm:file_perm ->
string ->
mode:open_flag list ->
f:(File_descr.t -> 'a) ->
'awith_file file ~mode ~perm ~f opens file, and applies f to the resulting file descriptor. When f finishes (or raises), with_file closes the descriptor and returns the result of f (or raises).
read fd buff ofs len reads len characters from descriptor fd, storing them in string buff, starting at position ofs in string buff. Return the number of characters actually read.
write fd buff ofs len writes len characters to descriptor fd, taking them from bytes buff, starting at position ofs in bytes buff. Return the number of characters actually written.
When an error is reported some characters might have already been written. Use single_write instead to ensure that this is not the case.
WARNING: write is an interruptible call and has no way to handle EINTR properly. You should most probably be using single write.
Same as write but with a string buffer.
val single_write :
?restart:bool ->
?pos:int ->
?len:int ->
File_descr.t ->
buf:Core.Bytes.t ->
intSame as write but ensures that all errors are reported and that no character has ever been written when an error is reported.
val single_write_substring :
?restart:bool ->
?pos:int ->
?len:int ->
File_descr.t ->
buf:string ->
intSame as single_write but with a string buffer.
Interfacing with the standard input/output library
Create an input channel reading from the given descriptor. The channel is initially in binary mode; use set_binary_mode_in ic false if text mode is desired.
Create an output channel writing on the given descriptor. The channel is initially in binary mode; use set_binary_mode_out oc false if text mode is desired.
Return the descriptor corresponding to an input channel.
Return the descriptor corresponding to an output channel.
Seeking and truncating
POSITIONING modes for UnixLabels.lseek.
Set the current position for a file descriptor
Truncates the named file to the given size.
Truncates the file corresponding to the given descriptor to the given size.
File statistics
type stats = Core_unix__.Import.Unix.LargeFile.stats = {st_dev : int;(*Device number
*)st_ino : int;(*Inode number
*)st_kind : file_kind;(*Kind of the file
*)st_perm : file_perm;(*Access rights
*)st_nlink : int;(*Number of links
*)st_uid : int;(*User id of the owner
*)st_gid : int;(*Group ID of the file's group
*)st_rdev : int;(*Device minor number
*)st_size : int64;(*Size in bytes
*)st_atime : float;(*Last access time
*)st_mtime : float;(*Last modification time
*)st_ctime : float;(*Last status change time
*)
}The informations returned by the UnixLabels.stat calls. The times are float number of seconds since the epoch; we don't use Time.t because Time depends on Unix, so the fix isn't so trivial. Same for Native_file.stats below.
Same as UnixLabels.stat, but in case the file is a symbolic link, return the information for the link itself.
Return the information for the file associated with the given descriptor.
This sub-module provides the normal OCaml Unix functions that deal with file size using native ints. These are here because, in general, you should be using 64bit file operations so that large files aren't an issue. If you have a real need to use potentially 31bit file operations (and you should be dubious of such a need) you can open this module
Locking
type lock_command = Core_unix__.Import.Unix.lock_command = | F_ULOCK(*Unlock a region
*)| F_LOCK(*Lock a region for writing, and block if already locked
*)| F_TLOCK(*Lock a region for writing, or fail if already locked
*)| F_TEST(*Test a region for other process locks
*)| F_RLOCK(*Lock a region for reading, and block if already locked
*)| F_TRLOCK(*Lock a region for reading, or fail if already locked
*)
Commands for lockf.
lockf fd cmd size place a lock on a file_descr that prevents any other process from calling lockf successfully on the same file. Due to a limitation in the current implementation the length will be converted to a native int, potentially throwing an exception if it is too large.
Note that, despite the name, this function does not call the UNIX lockf() system call; rather it calls fcntl() with one of F_SETLK, F_SETLKW, or F_GETLK.
flock fd cmd places or releases a lock on the fd as per the flock C call of the same name. The request is "nonblocking" (LOCK_NB in C), meaning that if the lock cannot be granted immediately, the return value is false. However, the system call still blocks until the lock status can be ascertained. true is returned if the lock was granted.
flock_blocking fd cmd places or releases a lock on the fd as per the flock C call. The function does not return until a lock can be granted.
Return true if the given file descriptor refers to a terminal or console window, false otherwise.
Mapping files into memory
val map_file :
File_descr.t ->
?pos:int64 ->
('a, 'b) Bigarray.kind ->
'c Bigarray.layout ->
shared:bool ->
int array ->
('a, 'b, 'c) Bigarray.Genarray.tMemory mapping of a file as a big array. map_file fd kind layout ~shared dims returns a big array of kind kind, layout layout, and dimensions as specified in dims.
The data contained in this big array are the contents of the file referred to by the file descriptor fd.
The optional pos parameter is the byte offset in the file of the data being mapped. It defaults to 0.
If shared is true, all modifications performed on the array are reflected in the file. This requires that fd be opened with write permissions. If shared is false, modifications performed on the array are done in memory only, using copy-on-write of the modified pages; the underlying file is not affected.
To adjust automatically the dimensions of the big array to the actual size of the file, the major dimension (that is, the first dimension for an array with C layout, and the last dimension for an array with Fortran layout) can be given as -1. map_file then determines the major dimension from the size of the file. The file must contain an integral number of sub-arrays as determined by the non-major dimensions, otherwise Failure is raised. If all dimensions of the big array are given, the file size is matched against the size of the big array. If the file is larger than the big array, only the initial portion of the file is mapped to the big array. If the file is smaller than the bigarray, the file is automatically grown to the size of the big array. This requires write permissions on fd.
Array accesses are bounds-checked, but the bounds are determined by the initial call to map_file. Therefore, you should make sure no other process modifies the mapped file while you're accessing it, or a SIGBUS signal may be raised. This happens, for instance, if the file is shrunk. Invalid_argument or Failure may be raised in cases where argument validation fails.
Operations on file names
Removes the named file
Removes the named file or directory
rename old new changes the name of a file from old to new.
link ?force ~target ~link_name () creates a hard link named link_name to the file named target. If force is true, an existing entry in place of link_name will be unlinked. This unlinking may raise a Unix error, e.g. if the entry is a directory.
File permissions and ownership
Change the permissions of an opened file.
Change the owner uid and owner gid of the named file.
Change the owner uid and owner gid of an opened file.
Set the process creation mask, and return the previous mask.
Check that the process has the given permissions over the named file.
Operations on file descriptors
Return a new file descriptor referencing the same file as the given descriptor.
dup2 ~src ~dst duplicates src to dst, closing dst if already opened.
Set the ``non-blocking'' flag on the given descriptor. When the non-blocking flag is set, reading on a descriptor on which there is temporarily no data available raises the EAGAIN or EWOULDBLOCK error instead of blocking; writing on a descriptor on which there is temporarily no room for writing also raises EAGAIN or EWOULDBLOCK.
Clear the ``non-blocking'' flag on the given descriptor. See UnixLabels.set_nonblock.
Set the ``close-on-exec'' flag on the given descriptor. A descriptor with the close-on-exec flag is automatically closed when the current process starts another program with one of the exec functions.
Clear the ``close-on-exec'' flag on the given descriptor. See UnixLabels.set_close_on_exec.
Directories
Create a directory. The permissions of the created directory are (perm & ~umask & 0777). The default perm is 0777.
Create a directory recursively. The permissions of the created directory are those granted by mkdir ~perm.
Remove an empty directory.
Change the process working directory.
Return the name of the current working directory.
Change the process root directory.
The type of descriptors over opened directories.
Open a descriptor on a directory
Return the next entry in a directory. Returns None when the end of the directory has been reached.
Same as readdir_opt except that it signals the end of the directory by raising End_of_file.
Reposition the descriptor to the beginning of the directory
Close a directory descriptor.
readdir_detailed_opt dh return the next entry in a directory. Returns None when the end of the directory has been reached.
ls_dir_detailed path returns the information from readdir_detailed_opt with an interface similar to that of Sys_unix.ls_dir.
Pipes and redirections
Create a pipe. The first component of the result is opened for reading, that's the exit to the pipe. The second component is opened for writing, that's the entrance to the pipe.
High-level process and redirection management
Low-level process
create_process ~prog ~args forks a new process that executes the program prog with arguments args. The function returns the pid of the process along with file descriptors attached to stdin, stdout, and stderr of the new process. The executable file prog is searched for in the path. The new process has the same environment as the current process. Unlike in execve the program name is automatically passed as the first argument.
val create_process_env :
?working_dir:string ->
?prog_search_path:string list ->
?argv0:string ->
?setpgid:Pgid.t ->
prog:string ->
args:string list ->
env:env ->
unit ->
Process_info.tcreate_process_env ~prog ~args ~env as create_process, but takes an additional parameter that extends or replaces the current environment. No effort is made to ensure that the keys passed in as env are unique, so if an environment variable is set twice the second version will override the first. If argv0 is given, it is used (instead of prog) as the first element of the argv array passed to execve.
The exact program to execute is determined using the usual conventions. More precisely, if prog contains at least one '/' character then it is used as is (relative to working_dir if prog is a relative path, absolute otherwise). Note that working_dir defaults to the working directory of the current process, i.e. getcwd (). If prog contains no '/' character, then it is looked up in prog_search_path: for the first dir in prog_search_path such that Filename.concat dir prog exists and is executable, Filename.concat dir prog is the program that will be executed.
prog_search_path defaults to the list of directories encoded as a ':' separated list in the "PATH" environment variable of the current running process. If no such variable is defined, then
["/bin"; "/usr/bin"]is used instead. Note that the "PATH" environment variable is looked up in the environment of the current running process, i.e. via getenv "PATH". Setting the "PATH" variable in the env argument of this function has no effect on how prog is resolved.
In a setuid or setgid program, or one which has inherited such privileges, reading of the PATH variable will return an empty result. If a search path is required then it should be provided explicitly using prog_search_path in such scenarios; alternatively, perhaps more satisfactorily, an absolute path should be given as prog.
High-level pipe and process management. These functions (with UnixLabels.open_process_out and UnixLabels.open_process) run the given command in parallel with the program, and return channels connected to the standard input and/or the standard output of the command. The command is interpreted by the shell /bin/sh (cf. system). Warning: writes on channels are buffered, hence be careful to call Caml.flush at the right times to ensure correct synchronization.
See UnixLabels.open_process_in.
See UnixLabels.open_process_in.
Similar to UnixLabels.open_process, but the second argument specifies the environment passed to the command. The result is a triple of channels connected to the standard output, standard input, and standard error of the command.
close_process_* raises Unix_error if, for example, the file descriptor has already been closed.
Close channels opened by UnixLabels.open_process_in, wait for the associated command to terminate, and return its termination status.
Close channels opened by UnixLabels.open_process_out, wait for the associated command to terminate, and return its termination status.
Close channels opened by UnixLabels.open_process, wait for the associated command to terminate, and return its termination status.
Close channels opened by UnixLabels.open_process_full, wait for the associated command to terminate, and return its termination status.
Symbolic links
symlink ~target ~link_name creates the file link_name as a symbolic link to the file target. On Windows, this has the semantics using stat as described at: http://caml.inria.fr/pub/docs/manual-ocaml/libref/Unix.html
Read the contents of a link.
Polling
val select :
?restart:bool ->
read:File_descr.t list ->
write:File_descr.t list ->
except:File_descr.t list ->
timeout:select_timeout ->
unit ->
Select_fds.tWait until some input/output operations become possible on some channels. The three list arguments are a set of descriptors to check for reading, for writing, or for exceptional conditions. ~timeout is the maximal timeout. The result is composed of three sets of descriptors: those ready for reading, ready for writing, and over which an exceptional condition is pending.
Setting restart to true means that we want select to restart automatically on EINTR (instead of propagating the exception)...
Wait until a non-ignored, non-blocked signal is delivered.
Time functions
type process_times = Core_unix__.Import.Unix.process_times = {tms_utime : float;(*User time for the process
*)tms_stime : float;(*System time for the process
*)tms_cutime : float;(*User time for the children processes
*)tms_cstime : float;(*System time for the children processes
*)
}The execution times (CPU times) of a process.
type tm = Core_unix__.Import.Unix.tm = {tm_sec : int;(*Seconds 0..59
*)tm_min : int;(*Minutes 0..59
*)tm_hour : int;(*Hours 0..23
*)tm_mday : int;(*Day of month 1..31
*)tm_mon : int;(*Month of year 0..11
*)tm_year : int;(*Year - 1900
*)tm_wday : int;(*Day of week (Sunday is 0)
*)tm_yday : int;(*Day of year 0..365
*)tm_isdst : bool;(*Daylight time savings in effect
*)
}The type representing wallclock time and calendar date.
Return the current time since 00:00:00 GMT, Jan. 1, 1970, in seconds.
Convert a time in seconds, as returned by UnixLabels.time, into a date and a time. Assumes UTC.
Convert a time in seconds, as returned by UnixLabels.time, into a date and a time. Assumes the local time zone.
Convert a date and time, specified by the tm argument, into a time in seconds, as returned by UnixLabels.time. Also return a normalized copy of the given tm record, with the tm_wday, tm_yday, and tm_isdst fields recomputed from the other fields. The tm argument is interpreted in the local time zone.
Convert a date and time, specified by the tm argument, into a formatted string. See 'man strftime' for format options.
val strptime :
?allow_trailing_input:bool ->
fmt:string ->
string ->
Core_unix__.Import.Unix.tmGiven a format string, convert a corresponding string to a date and time See 'man strptime' for format options.
Raise if allow_trailing_input is false and fmt does not consume all of the input.
Schedule a SIGALRM signal after the given number of seconds.
Stop execution for the given number of seconds.
nanosleep f delays execution of the program for at least f seconds. The function can return earlier if a signal has been delivered, in which case the number of seconds left is returned. Any other failure raises an exception.
Return the execution times of the process.
Set the last access time (second arg) and last modification time (third arg) for a file. Times are expressed in seconds from 00:00:00 GMT, Jan. 1, 1970.
type interval_timer = Core_unix__.Import.Unix.interval_timer = | ITIMER_REAL(*decrements in real time, and sends the signal
*)SIGALRMwhen expired.| ITIMER_VIRTUAL(*decrements in process virtual time, and sends
*)SIGVTALRMwhen expired.| ITIMER_PROF(*(for profiling) decrements both when the process is running and when the system is running on behalf of the process; it sends
*)SIGPROFwhen expired.
The three kinds of interval timers.
The type describing the status of an interval timer
Return the current status of the given interval timer.
setitimer t s sets the interval timer t and returns its previous status. The s argument is interpreted as follows: s.it_value, if nonzero, is the time to the next timer expiration; s.it_interval, if nonzero, specifies a value to be used in reloading it_value when the timer expires. Setting s.it_value to zero disable the timer. Setting s.it_interval to zero causes the timer to be disabled after its next expiration.
User id, group id
It's highly recommended to read the straight unix docs on these functions for more color. You can get that info from man pages or http://www.opengroup.org/onlinepubs/000095399/functions/setuid.html
Return the user id of the user executing the process.
Return the effective user id under which the process runs.
Sets the real user id and effective user id for the process. Only use this when superuser. To setuid as an ordinary user, see Core_extended.Unix.seteuid.
Return the group id of the user executing the process.
Return the effective group id under which the process runs.
Set the real group id and effective group id for the process.
Return the name of the user executing the process, from the Passwd module.
Note that this function is not always guaranteed to succeed: depending on OS configuration, computing the current username can involve network queries, which can fail transiently.
A deprecated alias for username.
Internet addresses
A representation of CIDR netmasks (e.g. "192.168.0.0/24") and functions to match if a given address is inside the range or not. Only IPv4 addresses are supported. Values are always normalized so the base address is the lowest IP address in the range, so for example to_string (of_string "192.168.1.101/24") = "192.168.1.0/24".
Sockets
The type of socket domains.
The type of socket kinds, specifying the semantics of communications.
type sockaddr = Core_unix__.Import.Unix.sockaddr = | ADDR_UNIX of string| ADDR_INET of Inet_addr.t * int
The type of socket addresses. ADDR_UNIX name is a socket address in the Unix domain; name is a file name in the file system. ADDR_INET(addr,port) is a socket address in the Internet domain; addr is the Internet address of the machine, and port is the port number.
sockaddr_blocking_sexp is like sockaddr, with of_sexp that performs DNS lookup to resolve Inet_addr.t.
val bin_writer_sockaddr_blocking_sexp :
sockaddr_blocking_sexp Core.Bin_prot.Type_class.writerval __bin_read_sockaddr_blocking_sexp__ :
(int -> sockaddr_blocking_sexp) Core.Bin_prot.Read.readerval bin_reader_sockaddr_blocking_sexp :
sockaddr_blocking_sexp Core.Bin_prot.Type_class.readerReturn the socket domain adequate for the given socket address.
val socket :
?close_on_exec:bool ->
domain:socket_domain ->
kind:socket_type ->
protocol:int ->
unit ->
File_descr.tCreate a new socket in the given domain, and with the given kind. The third argument is the protocol type; 0 selects the default protocol for that kind of sockets.
val socketpair :
?close_on_exec:bool ->
domain:socket_domain ->
kind:socket_type ->
protocol:int ->
unit ->
File_descr.t * File_descr.tCreate a pair of unnamed sockets, connected together.
Accept connections on the given socket. The returned descriptor is a socket connected to the client; the returned address is the address of the connecting client.
Bind a socket to an address.
Connect a socket to an address.
Set up a socket for receiving connection requests. The integer argument is the number of pending requests that will be established and queued for accept. Depending on operating system, version, and configuration, subsequent connections may be refused actively (as with RST), ignored, or effectively established and queued anyway.
Because handling of excess connections varies, it is most robust for applications to accept and close excess connections if they can. To be sure the client receives an RST rather than an orderly shutdown, you can setsockopt_optint file_descr SO_LINGER (Some 0) before closing.
In Linux, for example, the system configuration parameters tcp_max_syn_backlog, tcp_abort_on_overflow, and syncookies can all affect connection queuing behavior.
The type of commands for shutdown.
Shutdown a socket connection. SHUTDOWN_SEND as second argument causes reads on the other end of the connection to return an end-of-file condition. SHUTDOWN_RECEIVE causes writes on the other end of the connection to return a closed pipe condition (SIGPIPE signal).
Return the address of the given socket.
Return the address of the host connected to the given socket.
The flags for UnixLabels.recv, UnixLabels.recvfrom, UnixLabels.send and UnixLabels.sendto.
val recv :
File_descr.t ->
buf:Core.Bytes.t ->
pos:int ->
len:int ->
mode:msg_flag list ->
intReceive data from a connected socket.
val recvfrom :
File_descr.t ->
buf:Core.Bytes.t ->
pos:int ->
len:int ->
mode:msg_flag list ->
int * sockaddrReceive data from an unconnected socket.
val send :
File_descr.t ->
buf:Core.Bytes.t ->
pos:int ->
len:int ->
mode:msg_flag list ->
intSend data over a connected socket.
val send_substring :
File_descr.t ->
buf:string ->
pos:int ->
len:int ->
mode:msg_flag list ->
intSame as send but with a string buffer.
val sendto :
File_descr.t ->
buf:Core.Bytes.t ->
pos:int ->
len:int ->
mode:msg_flag list ->
addr:sockaddr ->
intSend data over an unconnected socket.
val sendto_substring :
File_descr.t ->
buf:string ->
pos:int ->
len:int ->
mode:msg_flag list ->
addr:sockaddr ->
intSame as sendto but with a string buffer.
Socket options
type socket_bool_option = | SO_DEBUG(*Record debugging information
*)| SO_BROADCAST(*Permit sending of broadcast messages
*)| SO_REUSEADDR(*Allow reuse of local addresses for bind
*)| SO_KEEPALIVE(*Keep connection active
*)| SO_DONTROUTE(*Bypass the standard routing algorithms
*)| SO_OOBINLINE(*Leave out-of-band data in line
*)| SO_ACCEPTCONN(*Report whether socket listening is enabled
*)| TCP_NODELAY(*Control the Nagle algorithm for TCP sockets
*)| IPV6_ONLY(*Forbid binding an IPv6 socket to an IPv4 address
*)| SO_REUSEPORT
The socket options that can be consulted with UnixLabels.getsockopt and modified with UnixLabels.setsockopt. These options have a boolean (true/false) value.
type socket_int_option = | SO_SNDBUF(*Size of send buffer
*)| SO_RCVBUF(*Size of received buffer
*)| SO_ERROR(*Report the error status and clear it
*)| SO_TYPE(*Report the socket type
*)| SO_RCVLOWAT(*Minimum number of bytes to process for input operations
*)| SO_SNDLOWAT(*Minimum number of bytes to process for output operations
*)
The socket options that can be consulted with UnixLabels.getsockopt_int and modified with UnixLabels.setsockopt_int. These options have an integer value.
The socket options that can be consulted with UnixLabels.getsockopt_optint and modified with UnixLabels.setsockopt_optint. These options have a value of type int option, with None meaning ``disabled''.
The socket options that can be consulted with UnixLabels.getsockopt_float and modified with UnixLabels.setsockopt_float. These options have a floating-point value representing a time in seconds. The value 0 means infinite timeout.
Return the current status of a boolean-valued option in the given socket.
Set or clear a boolean-valued option in the given socket.
Same as UnixLabels.getsockopt for an integer-valued socket option.
Same as UnixLabels.setsockopt for an integer-valued socket option.
Same as UnixLabels.getsockopt for a socket option whose value is an int option.
Same as UnixLabels.setsockopt for a socket option whose value is an int option.
Same as UnixLabels.getsockopt for a socket option whose value is a floating-point number.
Same as UnixLabels.setsockopt for a socket option whose value is a floating-point number.
High-level network connection functions
Connect to a server at the given address. Return a pair of buffered channels connected to the server. Remember to call Caml.flush on the output channel at the right times to ensure correct synchronization.
``Shut down'' a connection established with UnixLabels.open_connection; that is, transmit an end-of-file condition to the server reading on the other side of the connection.
val establish_server :
(Core.In_channel.t -> Core.Out_channel.t -> unit) ->
addr:sockaddr ->
unitEstablish a server on the given address. The function given as first argument is called for each connection with two buffered channels connected to the client. A new process is created for each connection. The function UnixLabels.establish_server never returns normally.
Host and protocol databases
Return the name of the local host.
type addr_info = {ai_family : socket_domain;(*Socket domain
*)ai_socktype : socket_type;(*Socket type
*)ai_protocol : int;(*Socket protocol number
*)ai_addr : sockaddr;(*Address
*)ai_canonname : string;(*Canonical host name
*)
}Address information returned by Unix.getaddrinfo.
addr_info_blocking_sexp is like addr_info, with of_sexp that performs DNS lookup to resolve Inet_addr.t.
type getaddrinfo_option = | AI_FAMILY of socket_domain(*Impose the given socket domain
*)| AI_SOCKTYPE of socket_type(*Impose the given socket type
*)| AI_PROTOCOL of int(*Impose the given protocol
*)| AI_NUMERICHOST(*Do not call name resolver, expect numeric IP address
*)| AI_CANONNAME(*Fill the
*)ai_canonnamefield of the result| AI_PASSIVE(*Set address to ``any'' address for use with
*)Unix.bind
Options to Unix.getaddrinfo.
getaddrinfo host service opts returns a list of Unix.addr_info records describing socket parameters and addresses suitable for communicating with the given host and service. The empty list is returned if the host or service names are unknown, or the constraints expressed in opts cannot be satisfied.
host is either a host name or the string representation of an IP address. host can be given as the empty string; in this case, the ``any'' address or the ``loopback'' address are used, depending whether opts contains AI_PASSIVE. service is either a service name or the string representation of a port number. service can be given as the empty string; in this case, the port field of the returned addresses is set to 0. opts is a possibly empty list of options that allows the caller to force a particular socket domain (e.g. IPv6 only, or IPv4 only) or a particular socket type (e.g. TCP only or UDP only).
type name_info = {ni_hostname : string;(*Name or IP address of host
*)ni_service : string;(*Name of service or port number
*)
}Host and service information returned by Unix.getnameinfo.
Options to Unix.getnameinfo.
getnameinfo addr opts returns the host name and service name corresponding to the socket address addr. opts is a possibly empty list of options that governs how these names are obtained. Raise Caml.Not_found or Not_found_s if an error occurs.
Terminal interface
The following functions implement the POSIX standard terminal interface. They provide control over asynchronous communication ports and pseudo-terminals. Refer to the termios man page for a complete description.
Set a timeout for a socket associated with an In_channel.t
Set a timeout for a socket associated with an Out_channel.t
exit_immediately exit_code immediately calls the exit system call with the given exit code without performing any other actions (unlike Caml.exit). Does not return.
Filesystem functions
mknod ?file_kind ?perm ?major ?minor path creates a filesystem entry. Note that only FIFO-entries are guaranteed to be supported across all platforms as required by the POSIX-standard. On Linux directories and symbolic links cannot be created with this function. Use Unix.mkdir and Unix.symlink instead there respectively.
I/O vectors
I/O functions
Extract a file descriptor from a directory handle.
Synchronize all filesystem buffers with disk.
Synchronize the kernel buffers of a given file descriptor with disk, but do not necessarily write file attributes.
val read_assume_fd_is_nonblocking :
File_descr.t ->
?pos:int ->
?len:int ->
Core.Bytes.t ->
intread_assume_fd_is_nonblocking fd ?pos ?len buf calls the system call read ASSUMING THAT IT IS NOT GOING TO BLOCK. Reads at most len bytes into buffer buf starting at position pos.
val write_assume_fd_is_nonblocking :
File_descr.t ->
?pos:int ->
?len:int ->
Core.Bytes.t ->
intwrite_assume_fd_is_nonblocking fd ?pos ?len buf calls the system call write ASSUMING THAT IT IS NOT GOING TO BLOCK. Writes at most len bytes from buffer buf starting at position pos.
val writev_assume_fd_is_nonblocking :
File_descr.t ->
?count:int ->
string IOVec.t array ->
intwritev_assume_fd_is_nonblocking fd ?count iovecs calls the system call writev ASSUMING THAT IT IS NOT GOING TO BLOCK using count I/O-vectors iovecs.
writev fd ?count iovecs like writev_assume_fd_is_nonblocking, but does not require the descriptor to not block. If you feel you have to use this function, you should probably have chosen I/O-vectors that build on bigstrings, because this function has to internally blit the I/O-vectors (ordinary OCaml strings) to intermediate buffers on the C-heap.
val pselect :
File_descr.t list ->
File_descr.t list ->
File_descr.t list ->
float ->
int list ->
File_descr.t list * File_descr.t list * File_descr.t listpselect rfds wfds efds timeout sigmask like Core_unix.select but also allows one to wait for the arrival of signals.
System configuration
See 'man sysconf' for documentation.
Temporary file and directory creation
mkstemp prefix creates and opens a unique temporary file with prefix, automatically appending a suffix of .tmp. followed by six random characters to make the name unique. Unlike C's mkstemp, prefix should not include six X's at the end.
The file descriptor will have close-on-exec flag set, atomically when the O_CLOEXEC flag is supported.
mkdtemp prefix creates a temporary directory with prefix, automatically appending a suffix of .tmp. followed by six random characters to make the name unique.
Signal handling
Causes abnormal program termination unless the signal SIGABRT is caught and the signal handler does not return. If the SIGABRT signal is blocked or ignored, the abort() function will still override it.
User id, group id
getgrouplist user group returns the list of groups to which user belongs. See 'man getgrouplist'.
Return the list of groups to which the user executing the process belongs.
Globbing and shell expansion
val fnmatch :
?flags:
[ `No_escape
| `Pathname
| `Period
| `File_name
| `Leading_dir
| `Casefold ]
list ->
pat:string ->
string ->
boolno system calls involved
val wordexp :
(?flags:[ `No_cmd | `Show_err | `Undef ] list ->
string ->
string array)
Core.Or_error.tSee man page for wordexp.
System information
Additional IP functionality
if_indextoname ifindex If ifindex is an interface index, then the function returns the interface name. Otherwise, it raises Unix_error.
mcast_join ?ifname ?source sock addr join a multicast group at addr with socket sock, from source at source if specified, optionally using network interface ifname.
mcast_leave ?ifname ?source sock addr leaves a multicast group at addr with socket sock, from source at source if specified, optionally using network interface ifname.
get_mcast_ttl sock reads the time-to-live value of outgoing multicast packets for socket sock.
set_mcast_ttl sock ttl sets the time-to-live value of outgoing multicast packets for socket sock to ttl.
get_mcast_loop sock reads the boolean argument that determines whether sent multicast packets are looped back to local sockets.
set_mcast_loop sock loop sets the boolean argument that determines whether sent multicast packets are looped back to local sockets.
set_mcast_ifname sock "eth0" sets outgoing multicast traffic on IPv4 UDP socket sock to go out through interface eth0.
This uses setsockopt with IP_MULTICAST_IF and applies to multicast traffic. For non-multicast applications, see Linux_ext.bind_to_interface.
For keeping your memory in RAM, i.e. preventing it from being swapped out.
- Error report
- Access to the process environment
- Process handling
- Basic file input/output
- Interfacing with the standard input/output library
- Seeking and truncating
- File statistics
- Locking
- Mapping files into memory
- Operations on file names
- File permissions and ownership
- Operations on file descriptors
- Directories
- Pipes and redirections
- High-level process and redirection management
- Symbolic links
- Polling
- Time functions
- User id, group id
- Internet addresses
- Sockets
- Socket options
- High-level network connection functions
- Host and protocol databases
- Terminal interface
- Filesystem functions
- I/O vectors
- I/O functions
- Temporary file and directory creation
- Signal handling
- User id, group id
- Globbing and shell expansion
- System information
- Additional IP functionality