用fcntl()设置阻塞函数的阻塞性质

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

#define ERR_EXIT(m)     do {         perror(m);        exit(EXIT_FAILURE);    }while(0)

void activate_nonblock(int fd);
void deactivate_nonblock(int fd);

int main(int argc, const char *argv[])
{
    activate_nonblock(STDIN_FILENO);
    char buffer[1024] = {0};
    int ret = read(STDIN_FILENO, buffer, 1024);
    if(ret == -1)
        printf("read");
    return 0;
}

void activate_nonblock(int fd)
{
    int ret;
    int flags = fcntl(fd, F_GETFL);
    if(flags == -1)
        ERR_EXIT("fcntl");
    flags |= O_NONBLOCK;
    ret = fcntl(fd, F_SETFL, flags);
    if(ret == -1)
        ERR_EXIT("fcntl");
}

void deactivate_nonblock(int fd)
{
    int ret;
    int flags = fcntl(fd, F_GETFL);
    if(flags == -1)
        ERR_EXIT("fcntl");
    flags &=~O_NONBLOCK;
    ret = fcntl(fd, F_SETFL, flags);
    if(ret == -1)
        ERR_EXIT("fcntl");
}

时间: 2024-10-21 18:12:19

用fcntl()设置阻塞函数的阻塞性质的相关文章

用fcntl()设置堵塞函数的堵塞性质

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #define ERR_EXIT(m) do { perror(m); exit(EXIT_FAILURE); }while(0) void

Linux fcntl函数设置阻塞与非阻塞

转自http://www.cnblogs.com/xuyh/p/3273082.html 用命令F_GETFL和F_SETFL设置文件标志,比如阻塞与非阻塞 F_SETFL     设置给arg描述符状态标志,可以更改的几个标志是:O_APPEND, O_NONBLOCK,O_SYNC和O_ASYNC. 命令字(cmd)F_GETFL和F_SETFL的标志如下面的描述: O_NONBLOCK       非阻塞I/O;如果read(2)调用没有可读取的数据,或者如果write(2)操作将阻塞,r

fcntl设置无阻塞的超时连接

场景描述:采用fcntl函数设置无阻塞套接字,尝试连接远程服务器,连接的时候出现如下的错误: if(fcntl(sock, F_SETFL, O_NONBLOCK) == -1)   return -1; printf("Connect return retval = %d,sock =%d\n",retval,sock);    retval = connect(sock, (struct sockaddr *)&edpinfo->servAddr, sizeof(st

win32 socket阻塞与非阻塞函数及设置

win32 socket中有些函数是默认阻塞的,比如accept(),send(),recv()等等,其中send()与recv()的阻塞概念与accept()的阻塞概念不同. send()与recv()只是完成数据的拷贝工作,即send()函数仅仅是将数据放到发送缓冲区中,至于实际的发送工作由网络协议完成:recv()函数仅仅是从接收缓冲区中读取数据,实际接收数据的操作由网络协议完成.send()的阻塞主要由发送数据填满发送缓冲区产生的,recv()的阻塞则是由接收缓冲区中没有数据可读引起的.

文件IO之——阻塞和非阻塞及perror函数

读常规文件是不会阻塞的,不管读多少字节,read一定会在有限的时间内返回.从终端设备或网络读则不一定,如果从终端输入的数据没有换行符,调用read读终端设备就会阻塞,如果网络上没有接收到数据包,调用read从网络读就会阻塞,至于会阻塞多长时间也是不确定的,如果一直没有数据到达就一直阻塞在那里.同样,写常规文件是不会阻塞的,而向终端设备或网络写则不一定.现在明确一下阻塞(Block)这个概念.当进程调用一个阻塞的系统函数时,该进程被置于睡眠(Sleep)状态,这时内核调度其它进程运行,直到该进程等

linux函数的阻塞与非阻塞IO及错误处理

1.阻塞是指进程等待某一个事件的发生而处于等待状态不往下执行,如果等待的事件发生了则会继续执行该进程.调用系统阻塞函数可能会导致进程阻塞进入睡眠状态. 2.阻塞IO之read读取键盘输入数据 3.linux错误处理 ###函数perro();r打印括号里的字符串和错误信息,全局变量errno会被赋值当出现错误信息时,赋的值为下面的错误标号 ###错误标号及对应错误 #define EPERM 1 /* Operation not permitted */ #define ENOENT 2 /*

socket 由浅入深 系列函数(五)socket 阻塞 与 非阻塞

socket 阻塞 与 非阻塞 author:songyanwu 1 概念理解 其实在我们在进行网络编程,在理解阻塞与非阻塞同时,还应该清楚同步与异步! 同步与阻塞 同步和阻塞是不同的,可是有时候在理解有会很模糊: 同步:事情一件件的做,做完一件返回一件,做不完不回复也不返回. 阻塞;  阻塞调用是指调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,cpu不会给线程分配时间片,即线程暂停运行).函数只有在得到结果之后才会返回. 说明:同步和阻塞 在以后接触内核驱动 的时候会

Node.js:创建应用+回调函数(阻塞/非阻塞)

一.创建应用 如果我们使用PHP来编写后端的代码时,需要Apache 或者 Nginx 的HTTP 服务器,并配上 mod_php5 模块和php-cgi.从这个角度看,整个"接收 HTTP 请求并提供 Web 页面"的需求根本不需要 PHP 来处理. 不过对 Node.js 来说,概念完全不一样了.使用 Node.js 时,我们不仅仅在实现一个应用,同时还实现了整个 HTTP 服务器.事实上,我们的 Web 应用以及对应的 Web 服务器基本上是一样的. 在我们创建 Node.js

Linux设备驱动中的阻塞和非阻塞I/O

[基本概念] 1.阻塞 阻塞操作是指在执行设备操作时,托不能获得资源,则挂起进程直到满足操作所需的条件后再进行操作.被挂起的进程进入休眠状态(不占用cpu资源),从调度器的运行队列转移到等待队列,直到条件满足. 2.非阻塞 非阻塞操作是指在进行设备操作是,若操作条件不满足并不会挂起,而是直接返回或重新查询(一直占用CPU资源)直到操作条件满足为止. 当用户空间的应用程序调用read(),write()等方法时,若设备的资源不能被获取,而用户又希望以阻塞的方式来访问设备,驱动程序应当在设备驱动层的