fopen android,fopen.c - Android社区 - https://www.androidos.net.cn/

本文详细分析了C++中的fopen函数实现,涵盖了文件打开的权限设置、错误处理、文件描述符管理和追加模式下的特殊处理。通过对源代码的解读,揭示了其内部的工作机制和潜在的问题处理策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*-

* Copyright (c) 1990, 1993

*The Regents of the University of California. All rights reserved.

*

* This code is derived from software contributed to Berkeley by

* Chris Torek.

*

* Redistribution and use in source and binary forms, with or without

* modification, are permitted provided that the following conditions

* are met:

* 1. Redistributions of source code must retain the above copyright

* notice, this list of conditions and the following disclaimer.

* 2. Redistributions in binary form must reproduce the above copyright

* notice, this list of conditions and the following disclaimer in the

* documentation and/or other materials provided with the distribution.

* 3. Neither the name of the University nor the names of its contributors

* may be used to endorse or promote products derived from this software

* without specific prior written permission.

*

* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND

* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE

* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE

* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL

* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS

* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)

* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT

* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY

* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF

* SUCH DAMAGE.

*/

#if defined(LIBC_SCCS) && !defined(lint)

static char sccsid[] = "@(#)fopen.c8.1 (Berkeley) 6/4/93";

#endif /* LIBC_SCCS and not lint */

#include __FBSDID("$FreeBSD$");

#include "namespace.h"

#include #include #include #include #include #include #include #include "un-namespace.h"

#include "local.h"

FILE *

fopen(const char * __restrict file, const char * __restrict mode)

{

FILE *fp;

int f;

int flags, oflags;

if ((flags = __sflags(mode, &oflags)) == 0)

return (NULL);

if ((fp = __sfp()) == NULL)

return (NULL);

if ((f = _open(file, oflags, DEFFILEMODE)) < 0) {

fp->_flags = 0;/* release */

return (NULL);

}

/*

* File descriptors are a full int, but _file is only a short.

* If we get a valid file descriptor that is greater than

* SHRT_MAX, then the fd will get sign-extended into an

* invalid file descriptor. Handle this case by failing the

* open.

*/

if (f > SHRT_MAX) {

fp->_flags = 0;/* release */

_close(f);

errno = EMFILE;

return (NULL);

}

fp->_file = f;

fp->_flags = flags;

fp->_cookie = fp;

fp->_read = __sread;

fp->_write = __swrite;

fp->_seek = __sseek;

fp->_close = __sclose;

/*

* When opening in append mode, even though we use O_APPEND,

* we need to seek to the end so that ftell() gets the right

* answer. If the user then alters the seek pointer, or

* the file extends, this will fail, but there is not much

* we can do about this. (We could set __SAPP and check in

* fseek and ftell.)

*/

if (oflags & O_APPEND)

(void)_sseek(fp, (fpos_t)0, SEEK_END);

return (fp);

}

C++程序

|

98行

|

3.26 KB

/*-

* Copyright (c) 1990, 1993

*The Regents of the University of California. All rights reserved.

*

* This code is derived from software contributed to Berkeley by

* Chris Torek.

*

* Redistribution and use in source and binary forms, with or without

* modification, are permitted provided that the following conditions

* are met:

* 1. Redistributions of source code must retain the above copyright

* notice, this list of conditions and the following disclaimer.

* 2. Redistributions in binary form must reproduce the above copyright

* notice, this list of conditions and the following disclaimer in the

* documentation and/or other materials provided with the distribution.

* 3. Neither the name of the University nor the names of its contributors

* may be used to endorse or promote products derived from this software

* without specific prior written permission.

*

* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND

* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE

* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE

* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL

* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS

* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)

* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT

* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY

* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF

* SUCH DAMAGE.

*/

#if defined(LIBC_SCCS) && !defined(lint)

static char sccsid[] = "@(#)fopen.c8.1 (Berkeley) 6/4/93";

#endif /* LIBC_SCCS and not lint */

#include

__FBSDID("$FreeBSD$");

#include "namespace.h"

#include

#include

#include

#include

#include

#include

#include

#include "un-namespace.h"

#include "local.h"

FILE *

fopen(const char * __restrict file, const char * __restrict mode)

{

FILE *fp;

int f;

int flags, oflags;

if ((flags = __sflags(mode, &oflags)) == 0)

return (NULL);

if ((fp = __sfp()) == NULL)

return (NULL);

if ((f = _open(file, oflags, DEFFILEMODE)) < 0) {

fp->_flags = 0;/* release */

return (NULL);

}

/*

* File descriptors are a full int, but _file is only a short.

* If we get a valid file descriptor that is greater than

* SHRT_MAX, then the fd will get sign-extended into an

* invalid file descriptor. Handle this case by failing the

* open.

*/

if (f > SHRT_MAX) {

fp->_flags = 0;/* release */

_close(f);

errno = EMFILE;

return (NULL);

}

fp->_file = f;

fp->_flags = flags;

fp->_cookie = fp;

fp->_read = __sread;

fp->_write = __swrite;

fp->_seek = __sseek;

fp->_close = __sclose;

/*

* When opening in append mode, even though we use O_APPEND,

* we need to seek to the end so that ftell() gets the right

* answer. If the user then alters the seek pointer, or

* the file extends, this will fail, but there is not much

* we can do about this. (We could set __SAPP and check in

* fseek and ftell.)

*/

if (oflags & O_APPEND)

(void)_sseek(fp, (fpos_t)0, SEEK_END);

return (fp);

}

Cmd line: com.android.soundrecorder Build fingerprint: 'iHand55/iHand55/iHand55:14/UP1A.231005.007/eng.zztl.20250730.183813:user/release-keys' ABI: 'arm64' Build type: optimized suspend all histogram: Sum: 2.239ms 99% C.I. 1us-1893.279us Avg: 172.230us Max: 1995us DALVIK THREADS (17): "main" prio=5 tid=1 Native | group="main" sCount=1 ucsCount=0 flags=1 obj=0x733ac4c8 self=0xb40000703ac2f6f0 | sysTid=12108 nice=-20 cgrp=top-app sched=0/0 handle=0x72fa57f4f8 | state=S schedstat=( 3647210499 102131647 1918 ) utm=288 stm=75 core=1 HZ=100 | stack=0x7fef869000-0x7fef86b000 stackSize=8188KB | held mutexes= native: #00 pc 000c2108 /apex/com.android.runtime/lib64/bionic/libc.so (mkdirat+8) (BuildId: c3622b5c0a4cde0d723ea2d964ec71b7) native: #01 pc 0002b24c /apex/com.android.art/lib64/libopenjdk.so (Java_java_io_UnixFileSystem_createDirectory0+92) (BuildId: c2be030b12d5d636e6dfc80ef23f2693) at java.io.UnixFileSystem.createDirectory0(Native method) at java.io.UnixFileSystem.createDirectory(UnixFileSystem.java:386) at java.io.File.mkdir(File.java:1323) at java.io.File.mkdirs(File.java:1362) at java.io.File.mkdirs(File.java:1361) at com.sprd.soundrecorder.SettingActivity.h(SettingActivity.java:12) at com.sprd.soundrecorder.SettingActivity.i(SettingActivity.java:58) at com.sprd.soundrecorder.SettingActivity.j(SettingActivity.java:8) at com.sprd.soundrecorder.service.RecordingService.onStartCommand(RecordingService.java:8) at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:4934) at android.app.ActivityThread.-$$Nest$mhandleServiceArgs(unavailable:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2381) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:205) at android.os.Looper.loop(Looper.java:294) at android.app.ActivityThread.main(ActivityThread.java:8376) at java.lang.reflect.Method.invoke(Native method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:640) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:982)
最新发布
08-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值