Linux 文件操作中的阻塞和非阻塞操作

转: http://blog.sina.com.cn/s/blog_5f84dc840100n2hb.html

//源代码
#include
#include
#include
#include
#include

char buffer[4096];
int main(int argc,char **argv)
{
    int delay = 1, n, m = 0;
    
    if(argc > 1)
    {
        delay = atoi(argv[1]);
        printf("delay = %d seconds\n", delay);
    }
    fcntl(0,F_SETFL,fcntl(0,F_GETFL)|O_NONBLOCK);//stdin
    fcntl(1,F_SETFL,fcntl(1,F_GETFL)|O_NONBLOCK);//stdout
    
    while(1)
    {
        n = read(0,buffer,4096);
        if (n > 0)
        {
            printf("Got %d byte data.\n", n);
        }
        if (n>0)
            m = write (1,buffer,n);
        if ((n<0||m<0) && (errno != EAGAIN))
            break;
        if ((n<0||m<0) && (errno == EAGAIN))
        {
           perror( n<0 ? "stdin working in NONBLOCK, no data!" : "stdout working in NONBLOCK, no data");
        }
        sleep(delay);
    }
    perror( n<0 ? "stdin" : "stdout");
    exit(1);
}
执行:
[root@localhost nbtest]# ./nbtest 5
delay = 5 seconds
stdin working in NONBLOCK, no data!: Resource temporarily unavailable
12345
Got 6 byte data.
12345
注意,
(1)在标准输入中键入回车后才算是有效输入。
(2)回车也算是输入的一个字符,比如输入12345+回车,实际读入的长度是6个字节。

你可能感兴趣的:(APUE)