# MAN2 MAN2 (2) Section 2 of the Manual describes system calls, and is for use primarily by programmers. The sections of the manual are: Section 1: User commands -->Section 2: System calls Section 3: C library Section 4: File formats Section 5: Miscellaneous Section 6: Games Section 7: Special files (devices) Section 8: Maintenance procedures # fork fork (2) PROTOTYPE: pid_t fork() - create a child process identical to the parent See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275 # wait wait (2) PROTOTYPE: pid_t wait(int *stat_loc) - wait for a child process to terminate and determine its exit status See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 276 # execve execl execv execle execve execlp execvp execl (2), execv (2), execle (2), execve (2), execlp (2), execvp (2) PROTOTYPE: int execl (path, arg0, arg1, ..., argn, (char *)) int execv (path, argv) int execle (path, arg0, arg1, ..., argn, (char *), envp) int execve (path, argv, envp) int execlp (file, arg0, arg1, ..., argn, (char *)) int execvp (file, argv) - substitute a new image for the existing process See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275 Concurrent Unix Programmer's Manual Vol 1B # exit exit (2) PROTOTYPE: void exit(int status) - terminate process See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275 # brk brk (2) PROTOTYPE: char * brk(char *addr) - change size of data segment See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275 # getpid getpid (2) PROTOTYPE: pid_t getpid() - get process id See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275 # signal signal (2) PROTOTYPE: void signal(int signr, void (*func())) - enable signal catching See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 276 # kill kill (2) PROTOTYPE: int kill(pid_t pid, int sig) - send a signal to a process See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275 # alarm alarm (2) PROTOTYPE: unsigned alarm(unsigned int sec) - set alarm clock timer See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275 # pause pause (2) PROTOTYPE: int pause() - suspend current process until signal received See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275 # creat creat (2) PROTOTYPE: int creat(char *path, mode_t mode) - create new file or truncate existing one See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275 # mkdir mkdir (2) PROTOTYPE: int mkdir(char *path, mode_t mode) - make a directory See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275 # mknod mknod (2) PROTOTYPE: int mknod(char *name, int mode, int addr, int size) - make a special (device) file See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275 # open open (2) PROTOTYPE: int open(char *path, int oflag, mode_t mode) - open a file for reading, writing, or both See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275 # close close (2) PROTOTYPE: int close(int fd) - close open file See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275 # read read (2) PROTOTYPE: int read(int fd, char *buf, unsigned nbyte) - read data from a file to a buffer See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275 # write write (2) PROTOTYPE: int write(int fd, char *buf, unsigned nbyte) - write data from a buffer to a file See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 276 # lseek lseek (2) PROTOTYPE: off_t lseek(int fd, off_t offset, int whence) - move file pointer See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275 # stat fstat stat (2), fstat (2) PROTOTYPE: int stat(char *path,struct stat *buf) - get info from i-node using file name int fstat(int fd, struct stat * buf) - get info from i-node using file descriptor See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275, 276 # dup dup2 dup (2), dup2 (2) PROTOTYPE: int dup(int fd) int dup2(int fd, int fd2) - duplicate file descriptor archivo abierto See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275 Concurrent Unix Programmer's Manual Vol 1B # pipe pipe (2) PROTOTYPE: int pipe(int fd[]) - create a pipe See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275 # ioctl ioctl (2) PROTOTYPE: int ioctl(int fd, int request, struct sgttyb *argp) - set device parameters See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275 # link link (2) PROTOTYPE: int link(char *path1, char *path2) - create a link See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275 # unlink unlink (2) PROTOTYPE: int unlink(char *path) - remove a directory entry See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 276 # mount mount (2) PROTOTYPE: int mount(char *name, char *special) - mount a file system See also: umount (2) Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275 # umount umount (2) PROTOTYPE: int umount(char *name) - unmount a file system See also: mount (2) Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 276 # sync sync (2) PROTOTYPE: int sync() - flush cache to disk See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 276 # chdir chdir (2) PROTOTYPE: int chdir(char *path) - change current directory See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275 # chroot chroot (2) PROTOTYPE: int chroot(char *path) - change root See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275 # chmod chmod (2) PROTOTYPE: int chmod (char *path, mode_t mode) - change protection bits See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275 # getuid getuid (2) PROTOTYPE: gid_t getuid() - determine uid of caller See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275 # getgid getgid (2) PROTOTYPE: uid_t getgid() - determine gid of caller See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275 # geteuid geteuid (2) PROTOTYPE: gid_t geteuid() - determine effective gid See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275 # getegid getegid (2) PROTOTYPE: uid_t getegid() - determine effective uid See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275 # setuid setuid (2) PROTOTYPE: int setuid(uid_t uid) - set uid See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275 # setgid setgid (2) PROTOTYPE: int setgid(gid_t gid) - set gid See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275 # chown chown (2) PROTOTYPE: int chown(char *path, uid_t owner, gid_t group) - change owner and/or group of file See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275 # umask umask (2) PROTOTYPE: mode_t umask(mode_t cmask) - set file mask See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275 # time time (2) PROTOTYPE: time_t time(time_t *loc) - get time since Jan 1 1970 See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275 # stime stime (2) PROTOTYPE: int stime(long *timep) - set time See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275 # utime utime (2) PROTOTYPE: int utime(char *path, struct utimbuf *times) - set file times See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275 # times times (2) PROTOTYPE: clock_t times(struct tms *buffer) - get accounting times See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275 # access access (2) PROTOTYPE: int access(char *path, int amode) - determine if access is permitted See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275 # fcntl fcntl (2) PROTOTYPE: int fcntl(int fd, struct stat *buf) - miscellaneous controls See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275 # rename rename (2) PROTOTYPE: int rename(char *old, char *new) - change name of file See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275 # rmdir rmdir (2) PROTOTYPE: int rmdir(char *path) - remove a directory See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275 # ptrace ptrace (2) PROTOTYPE: long ptrace(int req, pid_t pid, long addr, long data) - trace a process See also: Operating Systems Design and Implementation 22; Minix 1.5 Reference Manual 275 # accept NAME accept - accept a connection on a socket SYNOPSIS #include #include ns = accept(s, addr, addrlen) int ns, s; struct sockaddr *addr; int *addrlen; DESCRIPTION The argument s is a socket that has been created with socket(2), bound to an address with bind(2), is listening for connections after a listen(2). Accept extracts the first connection request on the queue of pending connections, creates a new socket with the same properties of s and allocates a new file descriptor, ns , for the socket. If no pending connections are present on the queue, and the socket is not marked as non-blocking, accept blocks the caller until a connection is present. If the socket is marked non-blocking and no pending connections are present on the queue, accept returns an error as described below. The accepted socket, ns , may not be used to accept more connections. The original socket s remains open. The argument addr is a result parameter that is filled in with the address of the connecting entity, as known to the communications layer. The exact format of the addr parameter is determined by the domain in which the communication is occurring. The addrlen is a value-result parameter; it should initially contain the amount of space pointed to by addr ; on return it will contain the actual length (in bytes) of the address returned. This call is used with connection-based socket types, currently with SOCK_STREAM. It is possible to select(2) a socket for the purposes of doing an accept by selecting it for read. For certain protocols which require an explicit confirmation, such as ISO or DATAKIT, one should think of accept as merely dequeueing the next connection request, and not in of itself implying confirmation. Confirmation can be implied by a normal read or write on the new file desciptor, and rejection can be implied by closing the new socket. One can obtain user connection request data without confirming the connection by issuing a recvmsg call with an msg_iovlen of 0 and a non-zero msg_controllen, or by issuing a getsockopt(2) request. Similarly, one can provide user connection rejection information by issuing a sendmsg call with providing only the control information, or by calling setsockopt(2). RETURN VALUE The call returns -1 on error. If it succeeds, it returns a non-negative integer that is a descriptor for the accepted socket. ERRORS The accept will fail if: [EBADF] The descriptor is invalid. [ENOTSOCK] The descriptor references a file, not a socket. [EOPNOTSUPP] The referenced socket is not of type SOCK_STREAM. [EFAULT] The addr parameter is not in a writable part of the user address space. [EWOULDBLOCK] The socket is marked non-blocking and no connections are present to be accepted. SEE ALSO bind(2), connect(2), listen(2), select(2), socket(2) OTHER INFO This call is part of the Tnet library. # bind NAME bind - bind a name to a socket SYNOPSIS #include #include bind(s, name, namelen) int s; struct sockaddr *name; int namelen; DESCRIPTION Bind assigns a name to an unnamed socket. When a socket is created with socket(2) it exists in a name space (address family) but has no name assigned. Bind requests that name be assigned to the socket. NOTES Binding a name in the UNIX domain creates a socket in the file system that must be deleted by the caller when it is no longer needed (using unlink(2)). The rules used in name binding vary between communication domains. Consult the manual entries in section 4 for detailed information. RETURN VALUE If the bind is successful, a 0 value is returned. A return value of -1 indicates an error, which is further specified in the global errno. ERRORS The bind call will fail if: [EBADF] S is not a valid descriptor. [ENOTSOCK] S is not a socket. [EADDRNOTAVAIL] The specified address is not available from the local machine. [EADDRINUSE] The specified address is already in use. [EINVAL] The socket is already bound to an address. [EACCES] The requested address is protected, and the current user has inadequate permission to access it. [EFAULT] The name parameter is not in a valid part of the user address space. The following errors are specific to binding names in the UNIX domain. [ENOTDIR] A component of the path prefix is not a directory. [EINVAL] The pathname contains a character with the high-order bit set. [ENAMETOOLONG] A component of a pathname exceeded 255 characters. [ENOENT] A prefix component of the path name does not exist. [ELOOP] Too many symbolic links were encountered in translating the pathname. [EIO] An I/O error occurred while making the directory entry or allocating the inode. [EROFS] The name would reside on a read-only file system. [EISDIR] A null pathname was specified. SEE ALSO connect(2), listen(2), socket(2), getsockname(2) OTHER INFO This call is part of the Tnet library. #connect NAME connect - initiate a connection on a socket SYNOPSIS #include #include connect(s, name, namelen) int s; struct sockaddr *name; int namelen; DESCRIPTION The parameter s is a socket. If it is of type SOCK_DGRAM, then this call specifies the peer with which the socket is to be associated; this address is that to which datagrams are to be sent, and the only address from which datagrams are to be received. If the socket is of type SOCK_STREAM, then this call attempts to make a connection to another socket. The other socket is specified by name, which is an address in the communications space of the socket. Each communications space interprets the name parameter in its own way. Generally, stream sockets may successfully connect only once; datagram sockets may use connect multiple times to change their association. Datagram sockets may dissolve the association by connecting to an invalid address, such as a null address. RETURN VALUE If the connection or binding succeeds, then 0 is returned. Otherwise a -1 is returned, and a more specific error code is stored in errno. ERRORS The call fails if: [EBADF] S is not a valid descriptor. [ENOTSOCK] S is a descriptor for a file, not a socket. [EADDRNOTAVAIL] The specified address is not available on this machine. [EAFNOSUPPORT] Addresses in the specified address family cannot be used with this socket. [EISCONN] The socket is already connected. [ETIMEDOUT] Connection establishment timed out without establishing a connection. [ECONNREFUSED] The attempt to connect was forcefully rejected. [ENETUNREACH] The network isn't reachable from this host. [EADDRINUSE] The address is already in use. [EFAULT] The name parameter specifies an area outside the process address space. [EINPROGRESS] The socket is non-blocking and the connection cannot be completed immediately. It is possible to select(2) for completion by selecting the socket for writing. [EALREADY] The socket is non-blocking and a previous connection attempt has not yet been completed. The following errors are specific to connecting names in the UNIX domain. These errors may not apply in future versions of the UNIX IPC domain. [ENOTDIR] A component of the path prefix is not a directory. [EINVAL] The pathname contains a character with the high-order bit set. [ENAMETOOLONG] A component of a pathname exceeded 255 characters, or an entire path name exceeded 1023 characters. [ENOENT] The named socket does not exist. [EACCES] Search permission is denied for a component of the path prefix. [EACCES] Write access to the named socket is denied. [ELOOP] Too many symbolic links were encountered in translating the pathname. SEE ALSO accept(2), select(2), socket(2), getsockname(2) OTHER INFO This call is part of the Tnet library. # gethostid NAME gethostname, sethostname - get/set name of current host SYNOPSIS gethostname(name, namelen) char *name; int namelen; sethostname(name, namelen) char *name; int namelen; DESCRIPTION Gethostname returns the standard host name for the current processor, as previously set by sethostname. The parameter namelen specifies the size of the name array. The returned name is null-terminated unless insufficient space is provided. Sethostname sets the name of the host machine to be name , which has length namelen . This call is restricted to the super-user and is normally used only when the system is bootstrapped. RETURN VALUE If the call succeeds a value of 0 is returned. If the call fails, then a value of -1 is returned and an error code is placed in the global location \fIerrno\fP. ERRORS The following errors may be returned by these calls: [EFAULT] The name or namelen parameter gave an invalid address. [EPERM] The caller tried to set the hostname and was not the super-user. SEE ALSO gethostid(2) BUGS Host names are limited to MAXHOSTNAMELEN (from ) characters, currently 64. OTHER INFO This call is part of the Tnet library. # gethostname NAME gethostname, sethostname - get/set name of current host SYNOPSIS gethostname(name, namelen) char *name; int namelen; sethostname(name, namelen) char *name; int namelen; DESCRIPTION Gethostname returns the standard host name for the current processor, as previously set by sethostname. The parameter namelen specifies the size of the name array. The returned name is null-terminated unless insufficient space is provided. Sethostname sets the name of the host machine to be name , which has length namelen . This call is restricted to the super-user and is normally used only when the system is bootstrapped. RETURN VALUE If the call succeeds a value of 0 is returned. If the call fails, then a value of -1 is returned and an error code is placed in the global location \fIerrno\fP. ERRORS The following errors may be returned by these calls: [EFAULT] The name or namelen parameter gave an invalid address. [EPERM] The caller tried to set the hostname and was not the super-user. SEE ALSO gethostid(2) BUGS Host names are limited to MAXHOSTNAMELEN (from ) characters, currently 64. OTHER INFO This call is part of the Tnet library. # getpeername NAME getpeername - get name of connected peer SYNOPSIS getpeername(s, name, namelen) int s; struct sockaddr *name; int *namelen; DESCRIPTION Getpeername returns the name of the peer connected to socket s . The namelen parameter should be initialized to indicate the amount of space pointed to by name . On return it contains the actual size of the name returned (in bytes). The name is truncated if the buffer provided is too small. DIAGNOSTICS A 0 is returned if the call succeeds, -1 if it fails. ERRORS The call succeeds unless: [EBADF] The argument s is not a valid descriptor. [ENOTSOCK] The argument s is a file, not a socket. [ENOTCONN] The socket is not connected. [ENOBUFS] Insufficient resources were available in the system to perform the operation. [EFAULT] The name parameter points to memory not in a valid part of the process address space. SEE ALSO accept(2), bind(2), socket(2), getsockname(2) OTHER INFO This call is part of the Tnet library. # getsockname NAME getsockname - get socket name SYNOPSIS getsockname(s, name, namelen) int s; struct sockaddr *name; int *namelen; DESCRIPTION Getsockname returns the current name for the specified socket. The namelen parameter should be initialized to indicate the amount of space pointed to by name . On return it contains the actual size of the name returned (in bytes). DIAGNOSTICS A 0 is returned if the call succeeds, \-1 if it fails. ERRORS The call succeeds unless: [EBADF] The argument s is not a valid descriptor. [ENOTSOCK] The argument s is a file, not a socket. [ENOBUFS] Insufficient resources were available in the system to perform the operation. [EFAULT] The name parameter points to memory not in a valid part of the process address space. SEE ALSO bind(2), socket(2) BUGS Names bound to sockets in the UNIX domain are inaccessible; getsockname returns a zero length name. OTHER INFO This call is part of the Tnet library. # getsockopt NAME getsockopt, setsockopt - get and set options on sockets SYNOPSIS #include #include getsockopt(s, level, optname, optval, optlen) int s, level, optname; char *optval; int *optlen; setsockopt(s, level, optname, optval, optlen) int s, level, optname; char *optval; int optlen; DESCRIPTION Getsockopt and setsockopt manipulate options associated with a socket. Options may exist at multiple protocol levels; they are always present at the uppermost ``socket'' level. When manipulating socket options the level at which the option resides and the name of the option must be specified. To manipulate options at the ``socket'' level, level is specified as SOL_SOCKET. To manipulate options at any other level the protocol number of the appropriate protocol controlling the option is supplied. For example, to indicate that an option is to be interpreted by the TCP protocol, level should be set to the protocol number of TCP; see getprotoent(3N). The parameters optval and optlen are used to access option values for setsockopt . For getsockopt they identify a buffer in which the value for the requested option(s) are to be returned. For getsockopt , optlen is a value-result parameter, initially containing the size of the buffer pointed to by optval , and modified on return to indicate the actual size of the value returned. If no option value is to be supplied or returned, optval may be supplied as 0. Optname and any specified options are passed uninterpreted to the appropriate protocol module for interpretation. The include file < sys/socket.h > contains definitions for ``socket'' level options, described below. Options at other protocol levels vary in format and name; consult the appropriate entries in section (4P). Most socket-level options take an int parameter for optval . For setsockopt , the parameter should non-zero to enable a boolean option, or zero if the option is to be disabled. SO_LINGER uses a struct linger parameter, defined in < sys/socket.h >, which specifies the desired state of the option and the linger interval (see below). The following options are recognized at the socket level. Except as noted, each may be examined with getsockopt and set with setsockopt . SO_BROADCAST SO_DEBUG toggle recording of debugging information SO_REUSEADDR toggle local address reuse SO_KEEPALIVE toggle keep connections alive SO_DONTROUTE toggle routing bypass for outgoing messages SO_LINGER linger on close if data present SO_BROADCAST toggle permission to transmit broadcast messages SO_OOBINLINE toggle reception of out-of-band data in band SO_SNDBUF set buffer size for output SO_RCVBUF set buffer size for input SO_TYPE get the type of the socket (get only) SO_ERROR get and clear error on the socket (get only) SO_DEBUG enables debugging in the underlying protocol modules. SO_REUSEADDR indicates that the rules used in validating addresses supplied in a bind(2) call should allow reuse of local addresses. SO_KEEPALIVE enables the periodic transmission of messages on a connected socket. Should the connected party fail to respond to these messages, the connection is considered broken and processes using the socket are notified via a SIGPIPE signal. SO_DONTROUTE indicates that outgoing messages should bypass the standard routing facilities. Instead, messages are directed to the appropriate network interface according to the network portion of the destination address. SO_LINGER controls the action taken when unsent messags are queued on socket and a close(2) is performed. If the socket promises reliable delivery of data and SO_LINGER is set, the system will block the process on the close attempt until it is able to transmit the data or until it decides it is unable to deliver the information (a timeout period, termed the linger interval, is specified in the setsockopt call when SO_LINGER is requested). If SO_LINGER is disabled and a close is issued, the system will process the close in a manner that allows the process to continue as quickly as possible. The option SO_BROADCAST requests permission to send broadcast datagrams on the socket. Broadcast was a privileged operation in earlier versions of the system. With protocols that support out-of-band data, the SO_OOBINLINE option requests that out-of-band data be placed in the normal data input queue as received; it will then be accessible with recv or read calls without the MSG_OOB flag. SO_SNDBUF and SO_RCVBUF are options to adjust the normal buffer sizes allocated for output and input buffers, respectively. The buffer size may be increased for high-volume connections, or may be decreased to limit the possible backlog of incoming data. The system places an absolute limit on these values. Finally, SO_TYPE and SO_ERROR are options used only with setsockopt . SO_TYPE returns the type of the socket, such as SOCK_STREAM; it is useful for servers that inherit sockets on startup. SO_ERROR returns any pending error on the socket and clears the error status. It may be used to check for asynchronous errors on connected datagram sockets or for other asynchronous errors. RETURN VALUE A 0 is returned if the call succeeds, \-1 if it fails. ERRORS The call succeeds unless: [EBADF] The argument s is not a valid descriptor. [ENOTSOCK] The argument s is a file, not a socket. [ENOPROTOOPT] The option is unknown at the level indicated. [EFAULT] The address pointed to by optval is not in a valid part of the process address space. For getsockopt , this error may also be returned if optlen is not in a valid part of the process address space. SEE ALSO ioctl(2), socket(2), getprotoent(3N) BUGS Several of the socket options should be handled at lower levels of the system. OTHER INFO This call is part of the Tnet library. # listen NAME listen - listen for connections on a socket SYNOPSIS listen(s, backlog) int s, backlog; DESCRIPTION To accept connections, a socket is first created with socket(2), a willingness to accept incoming connections and a queue limit for incoming connections are specified with listen(2), and then the connections are accepted with accept(2). The listen call applies only to sockets of type SOCK_STREAM or SOCK_SEQPACKET. The backlog parameter defines the maximum length the queue of pending connections may grow to. If a connection request arrives with the queue full the client may receive an error with an indication of ECONNREFUSED, or, if the underlying protocol supports retransmission, the request may be ignored so that retries may succeed. RETURN VALUE A 0 return value indicates success; -1 indicates an error. ERRORS The call fails if: [EBADF] The argument s is not a valid descriptor. [ENOTSOCK] The argument s is not a socket. [EOPNOTSUPP] The socket is not of a type that supports the operation listen. SEE ALSO accept(2), connect(2), socket(2) BUGS The backlog is currently limited (silently) to 5. OTHER INFO This call is part of the Tnet library. # recv NAME recv, recvfrom, recvmsg - receive a message from a socket SYNOPSIS #include #include cc = recv(s, buf, len, flags) int cc, s; char *buf; int len, flags; cc = recvfrom(s, buf, len, flags, from, fromlen) int cc, s; char *buf; int len, flags; struct sockaddr *from; int *fromlen; cc = recvmsg(s, msg, flags) int cc, s; struct msghdr *msg; int flags; DESCRIPTION Recvfrom , and recvmsg are used to receive messages from a socket, and may be used to receive data on a socket whether it is in a connected state or not. If from is non-zero, the source address of the message is filled in. Fromlen is a value-result parameter, initialized to the size of the buffer associated with from , and modified on return to indicate the actual size of the address stored there. The recv call is normally used only on a connected socket (see connect(2)) and is identitical to recfrom with a zero-valued fromlen parameter. As it is redundant, it may not be supported in future releases. The length of the message is returned in cc . If a message is too long to fit in the supplied buffer, excess bytes may be discarded depending on the type of socket the message is received from (see socket(2)). If no messages are available at the socket, the receive call waits for a message to arrive, unless the socket is nonblocking (see ioctl(2)) in which case a cc -1 is returned with the external variable errno set to EWOULDBLOCK. The select(2) call may be used to determine when more data arrives. The flags argument to a recv call is formed by or'ing one or more of the values, #define MSG_OOB 0x1 /* process out-of-band data */ #define MSG_PEEK 0x2 /* peek at incoming message */ #define MSG_DONTROUTE 0x4 /* send without using routing tables */ #define MSG_EOR 0x8 /* data completes record */ #define MSG_TRUNC 0x10 /* data discarded before delivery */ #define MSG_CTRUNC 0x20 /* control data lost before delivery */ The recvmsg call uses a msghdr structure to minimize the number of directly supplied parameters. This structure has the following form, as defined in : struct msghdr { caddr_t msg_name; /* optional address */ u_int msg_namelen; /* size of address */ struct iovec *msg_iov; /* scatter/gather array */ u_int msg_iovlen; /* # elements in msg_iov */ caddr_t msg_control; /* ancillary data, see below */ u_int msg_controllen; /* ancillary data buffer len */ int msg_flags; /* flags on received message */ }; Here msg_name and msg_namelen specify the destination address if the socket is unconnected; msg_name may be given as a null pointer if no names are desired or required. The msg_iov and msg_iovlen describe the scatter gather locations, as described in read(2). msg_control , which has length msg_controllen . This is a buffer for other protocol control related messages or other miscellaneous ancillary data. The messages are of the form: struct cmsghdr { u_int cmsg_len; /* data byte count, including hdr */ int cmsg_level; /* originating protocol */ int cmsg_type; /* protocol-specific type */ /* followed by u_char cmsg_data[]; */ }; As an example, one could use this to learn of changes in the data-stream in XNS/SPP, or in ISO, to obtain user-connection-request data by requesting a recvmsg with no uio provided immediately after an accept(), thought of here in the sense of get-next-connection- request without an implicit connection confirmation. Open file descriptors are now passed as ancillary data for AF_UNIX domain sockets, with cmsg_level being SOL_SOCKET and cmsg_type being SCM_RIGHTS. msg_flags is set on return in a way that may include some of the same values specified for the flags parameter to a recv system call. The returned values MSG_EOR indicates end-of-record, MSG_TRUNC indicates that some trailing datagram data was discarded, MSG_CTRUNC indicates that some control data was discarded due to lack of space. MSG_OOB is returned to indicate that expedited data was received. RETURN VALUE These calls return the number of bytes received, or -1 if an error occurred. ERRORS The calls fail if: [EBADF] The argument s is an invalid descriptor. [ENOTSOCK] The argument s is not a socket. [EWOULDBLOCK] The socket is marked non-blocking and the receive operation would block. [EINTR] The receive was interrupted by delivery of a signal before any data was available for the receive. [EFAULT] The data was specified to be received into a non-existent or protected part of the process address space. SEE ALSO fcntl(2), read(2), send(2), select(2), getsockopt(2), socket(2) OTHER INFO This call is part of the Tnet library. # send NAME send, sendto, sendmsg - send a message from a socket SYNOPSIS #include #include cc = send(s, msg, len, flags) int cc, s; char *msg; int len, flags; cc = sendto(s, msg, len, flags, to, tolen) int cc, s; char *msg; int len, flags; struct sockaddr *to; int tolen; cc = sendmsg(s, msg, flags) int cc, s; struct msghdr *msg; int flags; DESCRIPTION Send , sendto , and sendmsg are used to transmit a message to another socket. Send may be used only when the socket is in a connected state, while sendto and endmsg may be used at any time. The address of the target is given by to with tolen specifying its size. The length of the message is given by len . If the message is too long to pass atomically through the underlying protocol, then the error EMSGSIZE is returned, and the message is not transmitted. No indication of failure to deliver is implicit in a send . Return values of -1 indicate some locally detected errors. If no messages space is available at the socket to hold the message to be transmitted, then send normally blocks, unless the socket has been placed in non-blocking I/O mode. The select(2) call may be used to determine when it is possible to send more data. The flags parameter may include one or more of the following: #define MSG_OOB 0x1 /* process out-of-band data */ #define MSG_DONTROUTE 0x4 /* bypass routing, use direct interface */ The flag MSG_OOB is used to send out-of-band data on sockets that support this notion (e.g. SOCK_STREAM); the underlying protocol must also support out-of-band data. MSG_DONTROUTE is usually used only by diagnostic or routing programs. See recv(2) for a description of the msghdr structure. RETURN VALUE The call returns the number of characters sent, or -1 if an error occurred. ERRORS [EBADF] An invalid descriptor was specified. [ENOTSOCK] The argument s is not a socket. [EFAULT] An invalid user space address was specified for a parameter. [EMSGSIZE] The socket requires that message be sent atomically, and the size of the message to be sent made this impossible. [EWOULDBLOCK] The socket is marked non-blocking and the requested operation would block. [ENOBUFS] The system was unable to allocate an internal buffer. The operation may succeed when buffers become available. [ENOBUFS] The output queue for a network interface was full. This generally indicates that the interface has stopped sending, but may be caused by transient congestion. SEE ALSO fcntl(2), recv(2), select(2), getsockopt(2), socket(2), write(2) OTHER INFO This call is part of the Tnet library. # socket NAME socket - create an endpoint for communication SYNOPSIS #include #include s = socket(domain, type, protocol) int s, domain, type, protocol; DESCRIPTION Socket creates an endpoint for communication and returns a descriptor. The domain parameter specifies a communications domain within which communication will take place; this selects the protocol family which should be used. The protocol family generally is the same as the address family for the addresses supplied in later operations on the socket. These families are defined in the include file . The currently understood formats are PF_UNIX (UNIX internal protocols), PF_INET (ARPA Internet protocols), PF_NS (Xerox Network Systems protocols), and PF_IMPLINK (IMP host at IMP link layer). The socket has the indicated type, which specifies the semantics of communication. Currently defined types are: SOCK_STREAM SOCK_DGRAM SOCK_RAW SOCK_SEQPACKET SOCK_RDM A SOCK_STREAM type provides sequenced, reliable, two-way connection based byte streams. An out-of-band data transmission mechanism may be supported. A SOCK_DGRAM socket supports datagrams (connectionless, unreliable messages of a fixed (typically small) maximum length). A SOCK_SEQPACKET socket may provide a sequenced, reliable, two-way connection-based data transmission path for datagrams of fixed maximum length; a consumer may be required to read an entire packet with each read system call. This facility is protocol specific, and presently implemented only for PF_NS. SOCK_RAW sockets provide access to internal network protocols and interfaces. The types SOCK_RAW, which is available only to the super-user, and SOCK_RDM, which is planned, but not yet implemented, are not described here. The protocol specifies a particular protocol to be used with the socket. Normally only a single protocol exists to support a particular socket type within a given protocol family. However, it is possible that many protocols may exist, in which case a particular protocol must be specified in this manner. The protocol number to use is particular to the communication domain in which communication is to take place; see protocols(3N). Sockets of type SOCK_STREAM are full-duplex byte streams, similar to pipes. A stream socket must be in a connected state before any data may be sent or received on it. A connection to another socket is created with a connect(2) call. Once connected, data may be transferred using read(2) and write(2) calls or some variant of the send(2) and recv(2) calls. When a session has been completed a close(2) may be performed. Out-of-band data may also be transmitted as described in send(2) and received as described in recv(2). The communications protocols used to implement a SOCK_STREAM insure that data is not lost or duplicated. If a piece of data for which the peer protocol has buffer space cannot be successfully transmitted within a reasonable length of time, then the connection is considered broken and calls will indicate an error with -1 returns and with ETIMEDOUT as the specific code in the global variable errno. The protocols optionally keep sockets warm by forcing transmissions roughly every minute in the absence of other activity. An error is then indicated if no response can be elicited on an otherwise idle connection for a extended period (e.g. 5 minutes). A SIGPIPE signal is raised if a process sends on a broken stream; this causes naive processes, which do not handle the signal, to exit. SOCK_SEQPACKET sockets employ the same system calls as SOCK_STREAM sockets. The only difference is that read(2) calls will return only the amount of data requested, and any remaining in the arriving packet will be discarded. SOCK_DGRAM and SOCK_RAW sockets allow sending of datagrams to correspondents named in send(2) calls. Datagrams are generally received with recvfrom(2), which returns the next datagram with its return address. An fcntl(2) call can be used to specify a process group to receive a SIGURG signal when the out-of-band data arrives. It may also enable non-blocking I/O and asynchronous notification of I/O events via SIGIO. The operation of sockets is controlled by socket level options . These options are defined in the file < sys/socket.h >. Setsockopt(2) and getsockopt(2) are used to set and get options, respectively. RETURN VALUE A -1 is returned if an error occurs, otherwise the return value is a descriptor referencing the socket. ERRORS The socket call fails if: [EPROTONOSUPPORT] The protocol type or the specified protocol is not supported within this domain. [EMFILE] The per-process descriptor table is full. [ENFILE] The system file table is full. [EACCESS] Permission to create a socket of the specified type and/or protocol is denied. [ENOBUFS] Insufficient buffer space is available. The socket cannot be created until sufficient resources are freed. SEE ALSO accept(2), bind(2), connect(2), getsockname(2), getsockopt(2), ioctl(2), listen(2), read(2), recv(2), send(2), shutdown(2), socketpair(2), write(2) ``An Introductory 4.3BSD Interprocess Communication Tutorial.'' ``An Advanced 4.3BSD Interprocess Communication Tutorial.'' OTHER INFO This call is part of the Tnet library. # socketpair NAME socketpair - create a pair of connected sockets SYNOPSIS #include #include socketpair(d, type, protocol, sv) int d, type, protocol; int sv[2]; DESCRIPTION The socketpair call creates an unnamed pair of connected sockets in the specified domain d , of the specified type , and using the optionally specified protocol . The descriptors used in referencing the new sockets are returned in sv[0] and sv[1]. The two sockets are indistinguishable. DIAGNOSTICS A 0 is returned if the call succeeds, -1 if it fails. ERRORS The call succeeds unless: [EMFILE] Too many descriptors are in use by this process. [EAFNOSUPPORT] The specified address family is not supported on this machine. [EPROTONOSUPPORT] The specified protocol is not supported on this machine. [EOPNOSUPPORT] The specified protocol does not support creation of socket pairs. [EFAULT] The address sv does not specify a valid part of the process address space. SEE ALSO read(2), write(2), pipe(2) BUGS This call is currently implemented only for the UNIX domain. OTHER INFO This call is part of the Tnet library.