open函数返回值为0

open函数返回值为0open函数是我们开发中经常会遇到的,这个函数是对文件设备的打开操作,这个函数会返回一个句柄fd,我们通过这个句柄fd对设备文件读写操作。  我们在对这个fd作判断的时候,经常会用到:    fd=open(filename,O_RDONLY);     If(fd          Printf(“open%serror!\n”,fi

大家好,又见面了,我是你们的朋友全栈君。

        open函数是我们开发中经常会遇到的,这个函数是对文件设备的打开操作,这个函数会返回一个句柄fd,我们通过这个句柄fd对设备文件读写操作。

    我们在对这个fd作判断的时候,经常会用到:

        fd = open(filename, O_RDONLY);

        If (fd <= 0) {

                Printf(“open %s error!\n”, filename)

                return;;

        }

 

    正是这样的判断,前不久导致了项目上面的一个问题,我们先来看看open函数的原型:


        int open(constchar*pathname,intflags);

        int open(constchar*pathname,intflags,mode_tmode);

 

   函数参数:

                  pathname:打开文件的路径名

                 flags:用来控制打开文件的模式

                 mode:用来设置创建文件的权限(rwx)。当flags中带有O_CREAT时才有效。

   返回值:

        调用成功时返回一个文件描述符fd

        调用失败时返回-1,并修改errno

 

    正确的判断应该是 iffd < 0),那我们什么时候会fd=0呢,如果fd=0,那么已经正常打开了,但是我们判断了打开错误了。

        open函数返回的文件描述符fd一定是未使用的最小的文件描述符那么如果0没有使用,那么我们open的时候,首先就会获取到fd=0的情况。默认情况下,0,1,2这三个句柄对应的是标准输入,标准输出,标准错误,系统进程默认会打开012这三个文件描述符,而且指向了键盘和显示器的设备文件。所以通常我们open的返回值是从3开始的。

    如果我们在open之前,close其中的任何一个,则open的时候,则会用到close的最小的值:

            close(0);

            fd = open(filenameO_RDONLY);

            printf(fd = %d\n, fd);

 

    则可以发现我们就可以open的时候,返回了0fd.

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/141561.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(2)


相关推荐

  • ms17010漏洞复现-2003

    ms17010漏洞复现-2003先使用Smbtouch模块检测一下是否有漏洞。然后使用Doublepulsar写一个shellcode到本地。生成成功后的截图:再使用EternalRomance植入Doublepulsar后门。成功的截图: PS:仿佛是由于之前已经上传过bin的缘故,第二次测试的时候失败了。但是不影响后续操作。都成功了以后该我们的Doublepulsar来反弹shell了。…

  • 可执行源码:基于javaweb实现学生成绩管理系统,三种角色学生和教师 管理员,实现了学生信息管理,课程管理,教师信息管理,学生成绩汇总,学生登录注册,教师和管理员的登录,个人信息修改等[通俗易懂]

    可执行源码:基于javaweb实现学生成绩管理系统,三种角色学生和教师 管理员,实现了学生信息管理,课程管理,教师信息管理,学生成绩汇总,学生登录注册,教师和管理员的登录,个人信息修改等[通俗易懂]基于javaweb实现学生成绩管理系统,实现了学生信息管理,课程管理,教师信息管理,学生成绩汇总,学生登录注册,教师和管理员的登录,个人信息修改等。系统功能大致描述:基于javaweb实现学生成绩管理系统,实现了学生信息管理,课程管理,教师信息管理,学生成绩汇总,学生登录注册,教师和管理员的登录,个人信息修改等。使用的技术有jsp,servlet,jdbc,mysql,html,css,js…

  • C++学习——四种字符串与数据连接的方法

    C++学习——四种字符串与数据连接的方法方法调用很简单,sprintf itoa函数在我的其他博客也有详解,请翻阅查看,话不多说,直接撸代码:#include <iostream>#include <string>#include <cstdlib>#include <sstream>#include <cstring> using namespace std;…

  • sql连接本地数据库

    sql连接本地数据库sql连接本地数据库安装好SQL2008后,界面只有已安装的包和正在运行的包左侧没有数据库,无法进行数据库操作.这是因为打开软件后,会提示连接一个东西,连接的时候按照默认的话就会连接错。如果出现提示连接成功后的界面只有两个文件夹“已安装的包”、“正在运行的包”,则是连接到了IntegrationServices,而非SQLServer数据库引擎。解决方法:在对象资源管理器中,选择…

  • Mutex对象使用时发现的问题

    Mutex对象使用时发现的问题Mutex对象等待互斥对象的方法有:Mutex.WaitAll、WaitOne、Mutex.WaitAny使用Mutex对象经常出现的异常现象有:异常一、 由于出现被放弃的mutex,等待过程结束原因:获取互斥对象后没有显式的释放对应的互斥对象就结束了对应的线程解决办法:每调用一个等待方法,在结束调用时都要调用ReleaseMutex()方法进行Mutex对象释放。而每种释

  • DM368开发 — uboot、内核移植(转)「建议收藏」

    DM368开发 — uboot、内核移植(转)「建议收藏」参看:DAVINCIDM365-DM368开发攻略——U-BOOT-2010.12及UBL的移植参看:DAVINCIDM365-DM368开发攻略——linux-2.6.32的移植一、介绍u-boot-2010.12的特点u-boot-2010.12的架构组织越来越向LINUX架构靠拢,这是U-BOOT的发展趋势。DM36x的UBOOT源码放在dvsdk_dm368_4_02_00_06\ps

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号