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

来源:互联网 发布:网上买旧书知乎 编辑:程序博客网 时间:2024/06/05 02:47

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
  1. #include    <stdio.h>  
  2. #include    <stdlib.h>  
  3.    
  4.  #define     COUNT  10  
  5.  int  
  6.  main()  
  7.  {  
  8.     char    buf[COUNT];  
  9.     size_t  nbytes;  
  10.      int     n;  
  11.     
  12.      for (n = 0; n< COUNT; n++)  
  13.          buf[n] = 0;  
  14.     
  15.      nbytes = 10;  
  16.      read(stdin, buf, nbytes);  
  17.     
  18.      printf("hello\n");  
  19.      printf("%s\n", buf);  
  20.  }  


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


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

最后,改成:

[cpp] view plaincopy
  1. #include    <stdio.h>  
  2. #include    <unistd.h>  
  3. #include    <stdlib.h>  
  4. #include    <fcntl.h>  
  5.    
  6. #define     COUNT  10  
  7. int  
  8. main()  
  9. {  
  10.     char    buf[COUNT];  
  11.     size_t  nbytes;  
  12.     int     n, flags;  
  13.   
  14.   
  15.     for (n = 0; n< COUNT; n++)  
  16.         buf[n] = 0;  
  17.   
  18.   
  19.     if ( (flags = fcntl(STDIN_FILENO, F_GETFL, 0)) < 0)  
  20.     {  
  21.         printf("F_GETFL error");  
  22.         exit(0);  
  23.     }  
  24.       
  25.     printf("flags:%d\n", flags);  
  26.   
  27.   
  28.     nbytes = 10;  
  29.     read(STDIN_FILENO, buf, nbytes);   
  30.     printf("hello\n");  
  31.     printf("%s\n", buf);  
  32. }  


结果:

设置nonblock选项后:

[cpp] view plaincopy
  1. #include    <stdio.h>  
  2. #include    <unistd.h>  
  3. #include    <stdlib.h>  
  4. #include    <fcntl.h>  
  5.    
  6. #define     COUNT  10  
  7. int  
  8. main()  
  9. {  
  10.     char    buf[COUNT];  
  11.     size_t  nbytes;  
  12.     int     n, flags;  
  13.     int     fd;  
  14.   
  15.   
  16.     fd = 0;  
  17.   
  18.   
  19.     for (n = 0; n< COUNT; n++)  
  20.         buf[n] = 0;  
  21.   
  22.   
  23.     if ( (flags = fcntl(STDIN_FILENO, F_GETFL, 0)) < 0)  
  24.     {  
  25.         printf("F_GETFL error");  
  26.         exit(0);  
  27.     }  
  28.       
  29.     printf("flags old:%d\n", flags);  
  30.   
  31.   
  32.     flags |= O_NONBLOCK;  
  33.     if (fcntl(STDIN_FILENO, F_SETFL, flags) < 0)  
  34.     {  
  35.         printf("F_SETFL error");  
  36.         exit(0);  
  37.     }  
  38.       
  39.     printf("flags new:%d\n", flags);  
  40.   
  41.   
  42.   
  43.   
  44.     nbytes = 10;  
  45.     read(STDIN_FILENO, buf, nbytes);   
  46.     printf("hello\n");  
  47.     printf("%s\n", buf);  
  48. }  


结果:



结果就像我想的那样。read阻塞的话会停止不进行,而非阻塞的话将不等待从stdin读取数据这个动作。



2 0