fcntl设置文件描述符

How would I put my socket in non-blocking mode?
From: Andrew Gierth ([email protected] ):

 

Technically, fcntl(soc, F_SETFL, O_NONBLOCK) is incorrect since it clobbers all other file flags. Generally one gets away with it since the other flags (O_APPEND for example) don't really apply much to sockets. In a similarly rough vein, you would use fcntl(soc, F_SETFL, 0) to go back to blocking mode.

To do it right, use F_GETFL to get the current flags, set or clear the O_NONBLOCK flag, then use F_SETFL to set the flags.

And yes, the flag can be changed either way at will.

 

From: Michael Lampkin
Added on: 2002-06-01 00:53:57

Since this is a common question... the follow is sample code showing setting and un-setting for non-blocking on a socket.

Code:

#include "apue.h" #include <fcntl.h> void set_fl(int fd, int flags) /* flags are file status flags to turn on */ { int val; if ((val = fcntl(fd, F_GETFL, 0)) < 0) err_sys("fcntl F_GETFL error"); val |= flags; /* turn on flags */ if (fcntl(fd, F_SETFL, val) < 0) err_sys("fcntl F_SETFL error"); }

 

int flags; /* Set socket to non-blocking */ if ((flags = fcntl(sock_descriptor, F_GETFL, 0)) < 0) { /* Handle error */ } if (fcntl(socket_descriptor, F_SETFL, flags | O_NONBLOCK) < 0) { /* Handle error */ } /* Set socket to blocking */ if ((flags = fcntl(sock_descriptor, F_GETFL, 0)) < 0) { /* Handle error */ } if (fcntl(socket_descriptor, F_SETFL, flags & (~O_NONBLOCK)) < 0) { /* Handle error */ } 

 

UNIX环境高级编程会讲得详细一些。详见《UNIX环境高级编程》 3.14. Fcntl Function

 

你可能感兴趣的:(编程,unix,socket,function,File,Descriptor)