免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1622 | 回复: 5
打印 上一主题 下一主题

write()和read()函数问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-12-16 11:03 |只看该作者 |倒序浏览
按照书上写 了一个程序结果是正确的,但有的地方看不懂,请大虾指教 了谢谢阿 :)
以下是程序,看不懂为什么从hello1文件读出一次内容后他的文件描述符fds[0]就变为0
了 ,而向hello2文件里写一次以后他的文件描述符就不变阿。这个程序完成的功能是每
隔10s中就向hello2文件写一次数据。
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdlib.h>
#include<time.h>
#include<stdio.h>
int main(void)
{
   int fds[2];
   char buf[7]="hello!\n";
   int i,rc,maxfd;
   fd_set inset1,inset2;
   struct timeval tv;
   if((fds[0]=open("hello1",O_RDWR|O_CREAT,0666))<0)
       perror("open hello1");
   if((fds[1]=open("hello2",O_RDWR|O_CREAT,0666))<0)
       perror("open hello2");
   rc=write(fds[0],buf,7);
   if(rc)
        printf("rc=%d\n",rc);
   lseek(fds[0],0,SEEK_SET);
   maxfd=fds[0]>fds[1]?fds[0]:fds[1];
   FD_ZERO(&inset1);
   FD_SET(fds[0],&inset1);
   FD_ZERO(&inset2);
   FD_SET(fds[1],&inset2);
   tv.tv_sec=2;
   tv.tv_usec=0;
   while(FD_ISSET(fds[0],&inset1)||FD_ISSET(fds[1],&inset2)){
      if(select(maxfd+1,&inset1,&inset2,NULL,&tv)<0)
        perror("select");
      else{
        if(FD_ISSET(fds[0],&inset1)){
            rc=read(fds[0],buf,7);
            if(rc>0){
               buf[rc]='\0';
               printf("read:%s\n",buf);
               }else
                  perror("read");
                }
      if(FD_ISSET(fds[1],&inset2)){
            rc=write(fds[1],buf,7);
            if(rc>0){
               buf[rc]='\0';
               printf("rc:%d,write:%s\n",rc,buf);
               }else
                  perror("write");
                  sleep(10);
                }
                }
                }
                exit(0);
                }

论坛徽章:
0
2 [报告]
发表于 2006-12-16 11:07 |只看该作者
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdlib.h>
#include<time.h>
#include<stdio.h>

int
main(void)
{
        int             fds[2];
        char            buf[7] = "hello!\n";
        int             i, rc, maxfd;
        fd_set          inset1, inset2;
        struct timeval  tv;
        if ((fds[0] = open("hello1", O_RDWR | O_CREAT, 0666)) < 0)
                perror("open hello1");
        if ((fds[1] = open("hello2", O_RDWR | O_CREAT, 0666)) < 0)
                perror("open hello2");
        rc = write(fds[0], buf, 7);
        if (rc)
                printf("rc=%d\n", rc);
        lseek(fds[0], 0, SEEK_SET);
        maxfd = fds[0] > fds[1] ? fds[0] : fds[1];
        FD_ZERO(&inset1);
        FD_SET(fds[0], &inset1);
        FD_ZERO(&inset2);
        FD_SET(fds[1], &inset2);
        tv.tv_sec = 2;
        tv.tv_usec = 0;
        while (FD_ISSET(fds[0], &inset1) || FD_ISSET(fds[1], &inset2)) {
                if (select(maxfd + 1, &inset1, &inset2, NULL, &tv) < 0)
                        perror("select");
                else {
                        if (FD_ISSET(fds[0], &inset1)) {
                                rc = read(fds[0], buf, 7);
                                if (rc > 0) {
                                        buf[rc] = '\0';
                                        printf("read:%s\n", buf);
                                } else
                                        perror("read");
                        }
                        if (FD_ISSET(fds[1], &inset2)) {
                                rc = write(fds[1], buf, 7);
                                if (rc > 0) {
                                        buf[rc] = '\0';
                                        printf("rc:%d,write:%s\n", rc, buf);
                                } else
                                        perror("write");
                                sleep(10);
                        }
                }
        }
        exit(0);
}

论坛徽章:
0
3 [报告]
发表于 2006-12-17 10:03 |只看该作者
?什么意思阿?
不太明白:(

论坛徽章:
0
4 [报告]
发表于 2006-12-19 19:26 |只看该作者
楼主自己写的么,NB!

论坛徽章:
0
5 [报告]
发表于 2006-12-19 19:40 |只看该作者
抱歉,没有看清楚问题的意思。

您说,看不懂为什么从hello1文件读出一次内容后他的文件描述符fds[0]就变为0
了 ,而向hello2文件里写一次以后他的文件描述符就不变阿

我检查了程序,并没有把 fds[0] 的指针传给任何函数,也没有修改这个值,怎么会变成 0 呢?

论坛徽章:
0
6 [报告]
发表于 2006-12-21 13:25 |只看该作者

你系统版本多少

这程序可以正常运行.就是把文件从1拷到2,但第一文件最少才7个字节,所以运行1次拷备后,有出文件结素或异常,
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP