您的位置:首页 > 其它

read( ) 函数 —— 终端输入设备的阻塞与非阻塞的设置

2015-12-30 19:50 357 查看
read( ) 函数 —— 终端输入设备的阻塞与非阻塞的设置

    如果没有数据,那么该调用将被阻塞.处于等待状态,直到有字符输入,

    或者到了规定的时限和出现错误为止,

    通过以下方法,能使read函数立即返回。

    fcntl(fd,F_SETFL,FNDELAY);

    FNDELAY 函数使read函数在端口没月字符存在的情况下,立刻返回0,

    如果要恢复正常(阻塞)状态,可以调用fcntl()函数,不要FNDELAY参数,

    如下所示:

        fcntl(Fd,F_SETFL,0);

    在使用O_NDELAY参数打开串行口后,同样与使用了该函数调用。

    

    fcntl(fd,F_SETFL,0); 

----------------------------
http://blog.csdn.net/mituan2008/article/details/6711830
read(stdin, buf, size);

printf(“hello”);

如果read是阻塞的则会停止到read语句不会执行下一个语句;否则不会停止,会执行下一个语句。

[cpp] view
plaincopy

#include    <stdio.h>  

#include    <stdlib.h>  

   

 #define     COUNT  10  

 int  

 main()  

 {  

    char    buf[COUNT];  

    size_t  nbytes;  

     int     n;  

    

     for (n = 0; n< COUNT; n++)  

         buf
 = 0;  

    

     nbytes = 10;  

     read(stdin, buf, nbytes);  

    

     printf("hello\n");  

     printf("%s\n", buf);  

 }  

这个标准输入,我想应该是会阻塞的,结果是没有阻塞:



没有停止等待输入就直接输出了。这是有问题的,stdin是指针类型而read要求用int型的参数。

最后,改成:

[cpp] view
plaincopy

#include    <stdio.h>  

#include    <unistd.h>  

#include    <stdlib.h>  

#include    <fcntl.h>  

   

#define     COUNT  10  

int  

main()  

{  

    char    buf[COUNT];  

    size_t  nbytes;  

    int     n, flags;  

  

  

    for (n = 0; n< COUNT; n++)  

        buf
 = 0;  

  

  

    if ( (flags = fcntl(STDIN_FILENO, F_GETFL, 0)) < 0)  

    {  

        printf("F_GETFL error");  

        exit(0);  

    }  

      

    printf("flags:%d\n", flags);  

  

  

    nbytes = 10;  

    read(STDIN_FILENO, buf, nbytes);   

    printf("hello\n");  

    printf("%s\n", buf);  

}  

结果:


设置nonblock选项后:

[cpp] view
plaincopy

#include    <stdio.h>  

#include    <unistd.h>  

#include    <stdlib.h>  

#include    <fcntl.h>  

   

#define     COUNT  10  

int  

main()  

{  

    char    buf[COUNT];  

    size_t  nbytes;  

    int     n, flags;  

    int     fd;  

  

  

    fd = 0;  

  

  

    for (n = 0; n< COUNT; n++)  

        buf
 = 0;  

  

  

    if ( (flags = fcntl(STDIN_FILENO, F_GETFL, 0)) < 0)  

    {  

        printf("F_GETFL error");  

        exit(0);  

    }  

      

    printf("flags old:%d\n", flags);  

  

  

    flags |= O_NONBLOCK;  

    if (fcntl(STDIN_FILENO, F_SETFL, flags) < 0)  

    {  

        printf("F_SETFL error");  

        exit(0);  

    }  

      

    printf("flags new:%d\n", flags);  

  

  

  

  

    nbytes = 10;  

    read(STDIN_FILENO, buf, nbytes);   

    printf("hello\n");  

    printf("%s\n", buf);  

}  

结果:



结果就像我想的那样。read阻塞的话会停止不进行,而非阻塞的话将不等待从stdin读取数据这个动作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: