Chinaunix

标题: fcntl系统调用 [打印本页]

作者: whoisliang    时间: 2009-01-04 16:30
标题: fcntl系统调用
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
char buffer[4096];
int main(int argc,char** argv)
{
        int delay=1,n,m=0;
        if(argc>1)
                delay=atoi(argv[1]);
        fcntl(0,F_SETFL,fcntl(0,F_GETFL) | O_NONBLOCK);
        fcntl(1,F_SETFL,fcntl(1,F_GETFL) | O_NONBLOCK);
        while(1){
                n=read(0,buffer,4096);
                if(n==-1){
                        printf("errno=%i %s\n",errno,perror("because"));
                       }
                       
                if(n>=0)
                        m=write(1,buffer,n);
                if((n<0 || m<0) &&(errno!=EAGAIN))
                        break;
                sleep(delay);
        }
        perror(n<0?"stdin":"stdout");
        exit(1);
        return 0;
}

为什么如下执行时会出现:
[root@kal root]# ./mynbtest 3
because: Resource temporarily unavailable
errno=29 ? ?
stdin: Illegal seek
[root@kal root]#
如果去掉 if(n==-1){
                 printf("errno=%i %s\n",errno,perror("because"));
                 }
本程序就:
光标在闪,但不动,输入字符后回车,3秒后输入的字符自动出现.

[ 本帖最后由 whoisliang 于 2009-1-4 17:08 编辑 ]
作者: wenrsh    时间: 2009-01-05 17:46
只有文件描述符
文件呢
int fd;
fd=open(...)
作者: whoisliang    时间: 2009-01-07 13:58
标题: 回复 #2 wenrsh 的帖子
0和1号文件(stdin stdout stderr)系统始终是打开的
作者: duanjigang    时间: 2009-01-08 16:33
LZ是要做个交互界面吗???
先说明你的用途然后再贴程序。。。
还有,尽量代码用code括起来,方便别人阅读
作者: whoisliang    时间: 2009-01-08 20:31
照着LDD3中源代码改了一点点,就出现以上问题.大家将源代码copy之后编译试试就能明白我的问题,要我说很难说明白.
作者: chrisli84    时间: 2009-01-09 16:05
输入命令的时候,把标准输入重定向,好像就没问题了。
./test 3 <file

我这样试了一下,可以运行。但是不知道为什么,也不知道你的程序是想干什么。呵呵。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2