首先,我知道用fopen()打开一个文件而不关闭它是非常不负责任和糟糕的形式.这只是纯粹的好奇心,所以请幽默我:)
我知道如果一个C程序打开一堆文件并且从不关闭它们中的任何一个,最终fopen()将开始失败.是否还有其他可能导致代码本身问题的副作用?例如,如果我有一个程序打开一个文件,然后退出而不关闭它,是否会导致运行该程序的人出现问题?这样的程序会泄漏任何内容(内存,文件句柄)吗?程序完成后,再次访问该文件会有问题吗?如果该程序连续多次运行会发生什么?
我希望我的程序打开一个文件,如果它存在,或者创建该文件.我正在尝试以下代码,但我在freopen.c上得到一个调试断言.我会不会更好地使用fclose然后立即fopen?
FILE *fptr;
fptr = fopen("scores.dat", "rb+");
if(fptr == NULL) //if file does not exist, create it
{
freopen("scores.dat", "wb", fptr);
}
Run Code Online (Sandbox Code Playgroud) 根据手册页fclose(3):
返回值
成功完成后返回0.否则,
EOF返回并设置全局变量errno以指示错误.在任何一种情况下fclose(),对流的任何进一步访问(包括另一次调用)都会导致未定义的行为.错误
EBADF底层文件描述符fp无效.该
fclose()函数也可能失败并设置errno为例程指定的任何错误close(2),write(2)或fflush(3).
当然fclose(NULL)应该失败,但我希望它能够errno正常返回,而不是直接通过分段故障死亡.这种行为有什么原因吗?
提前致谢.
更新:我将把我的代码放在这里(strerror()特别是我正在努力).
FILE *not_exist = NULL;
not_exist = fopen("nonexist", "r");
if(not_exist == NULL){
printError(errno);
}
if(fclose(not_exist) == EOF){
printError(errno);
}
Run Code Online (Sandbox Code Playgroud) 我只是想知道函数fopen,fclose,socket和closesocket.当调用fopen或打开套接字时,到底发生了什么(尤其是内存方式)?
打开文件/套接字而不关闭它们会导致内存泄漏吗?
第三,如何创建套接字,它们看起来像内存一样明智?
我也对操作系统(Windows)在读取套接字和发送数据方面的作用感兴趣.
我希望知道文件关闭后FILE指针会发生什么.它会是NULL吗?
基本上,我想在关闭文件之前检查文件是否已经关闭.
例如如下:
FILE *f;
if(f!=NULL)
{
fclose(f);
}
Run Code Online (Sandbox Code Playgroud)
我可以这样做,还是有其他方法可以解决这个问题?
我的应用程序异常退出信号11.我不知道这意味着什么.没有崩溃日志,调试器没有显示错误.该应用程序刚刚消失.
我得到了以下日志.
Apr 27 21:31:31 unknown Apollo[1408] <Warning>: bring tab <VUIWebController: 0x2dcf30> to front
Apr 27 21:31:31 unknown configd[29] <Notice>: jetsam: kernel termination snapshot being created
Apr 27 21:31:32 unknown com.apple.launchd[1] <Notice>: (UIKitApplication:com.apple.mobilemail[0x81d8]) Exited: Killed: 9
Apr 27 21:31:32 unknown com.apple.launchd[1] <Notice>: (UIKitApplication:com.ihanghai.apollo[0x4f16]) Bug: launchd_core_logic.c:3795 (24506):0
Apr 27 21:31:32 unknown SpringBoard[33] <Warning>: Application 'Mail' exited abnormally with signal 9: Killed: 9
Apr 27 21:31:32 unknown com.apple.debugserver-50[1407] <Warning>: 1 [057f/1503]: error: ::read ( 4, 0x2ffc29f0, 1024 ) => -1 err = …Run Code Online (Sandbox Code Playgroud) 想象以下代码作为线程运行:
void *thread_worker(void *q) {
for (;;) {
int fd = some_queue_get(q);
FILE *writer = fdopen(fd, "w");
if (!writer) { perror("fdopen"; close(fd); continue; }
// do something with writer
if (fclose(writer) == EOF) {
perror("fclose writer");
// should fd be closed here?
close(fd);
}
}
Run Code Online (Sandbox Code Playgroud)
fclose(3) 可能因各种原因而失败 - 是否有保证/何时关闭底层文件描述符或之后它仍然打开?
我有一个目录更改监视器进程,它从一组目录中的文件读取更新.我有另一个进程,对这些目录(测试程序)执行大量文件的小写操作.图大约100个目录,每个目录有10个文件,每秒约有500个文件被修改.
运行一段时间后,目录监视器进程挂起一个fclose()基本上拖尾文件的方法的调用.在这个方法中,我fopen()是文件,检查句柄是否有效,做一些搜索和读取,然后调用fclose().这些读取都由进程中的同一个线程执行.挂起后,线程永远不会进展.
我找不到任何关于为什么fclose()可能死锁而不是返回某种错误代码的好信息.文档确实提到了_fclose_nolock(),但似乎我没有(Visual Studio 2003).
调试和发布版本都会挂起.在调试版本中,我可以看到在返回之前挂起的fclose()调用_free_base().某种调用kernel32.dll => ntdll.dll => KernelBase.dll => ntdll.dll正在旋转.这是来自ntdll.dll的无限循环的程序集:
77CEB83F cmp dword ptr [edi+4Ch],0
77CEB843 lea esi,[ebx-8]
77CEB846 je 77CEB85E
77CEB848 mov eax,dword ptr [edi+50h]
77CEB84B xor dword ptr [esi],eax
77CEB84D mov al,byte ptr [esi+2]
77CEB850 xor al,byte ptr [esi+1]
77CEB853 xor al,byte ptr [esi]
77CEB855 cmp byte ptr [esi+3],al
77CEB858 jne 77D19A0B
77CEB85E mov eax,200h
77CEB863 cmp word ptr [esi],ax
77CEB866 ja …Run Code Online (Sandbox Code Playgroud) 我一直在尝试使用C语言进行简单的文件处理,我想确保使用此文件可以访问该文件
#include<stdio.h>
main()
{
CheckFile();
}
int CheckFile()
{
int checkfile=0;
FILE *fp1;
fp1 = fopen("users.sav","r");
if(fp1==NULL)
{
fopen("users.sav","w");
fclose(fp1);
}
if(checkfile!=0)printf("\nERROR ACCESSING FILE!\nNow exiting program with exit code: %d\n",checkfile);exit(1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然后它显示
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)
但如果文件已经预先存在(例如我手动创建或第二次运行程序时),则不会出现段错误
请帮忙.我需要这个在一周内完成的最终项目,我还没有掌握文件和指针.
我正在使用"gcc(Ubuntu/Linaro 4.8.1-10ubuntu9)4.8.1"
PS
我知道存在明显相似的问题,但请不要这样做.明白我已经开始编写了几个月,因此无法理解这些高级代码和内容.
PPS
我在另一个问题中看到了这个
在原始代码中无法保证fopen实际上正在工作,在这种情况下它将返回NULL并且fclose将不会被定义为行为.
那么我该如何检查它是否有效?
我的脚本完成后我可以删除该文件,但是当它正在运行时我无法触摸它,即使在一个之后fclose().这是我正在尝试使用的代码:
$Files = glob("$_SERVER[DOCUMENT_ROOT]/files/*.csv");
$File = fopen($Files[0], "r");
//while (($Data = fgetcsv($File)) !== false) {...
$i = 0;
while (is_resource($File)) {
$i && sleep(1);
echo "Closing handle.\n";
fclose($File);
if (++$i > 5)
die("Could not close handle.");
}
foreach ($Files as $File) {
$i = 0;
while (file_exists($File)) {
$i && sleep(1);
echo "Deleting file.\n";
@unlink($File);
echo 'www-data@debian:~$ ', $Command = "rm -f '$File' 2>&1", "\n", shell_exec($Command);
if (++$i > 5)
die("Could not delete the file.");
}
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到我试图删除它 …