fcntl設定檔案描述符

來源:互聯網
上載者:User

How would I put my socket in non-blocking mode?
From: Andrew Gierth (andrew@erlenstar.demon.co.uk
):

 

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

 

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

 

UNIX環境進階編程會講得詳細一些。詳見《UNIX環境進階編程》 3.14. Fcntl Function

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.