我有一个打开并读取相同文件(不写入)的多线程应用程序.我为每个线程打开一个不同的文件描述符(但它们都指向同一个文件).然后每个线程读取文件并关闭它并在达到EOF时再次打开它.这个可以吗?如果我对文件描述符执行fclose()会影响指向同一文件的其他文件descritptors吗?
我正在尝试使用proc_open执行一个进程.管道处理过程的I/O !!
$descriptorspec = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("pipe", "w")
);
Run Code Online (Sandbox Code Playgroud)
现在,实际上,我打开的"c程序"有时会卡住,我添加了一个max_time_limit检查,强制关闭进程.我已经添加了回调函数 - 即onExit - (使用"call_user_function"),以便以有效方式或强制方式处理"进程退出"时的信息.
在"退出"功能中,我正在关闭i/o管道
foreach ($pipes as $pipe) {
fclose($pipe);
}
Run Code Online (Sandbox Code Playgroud)
如果进程有一个有效的退出,上面的工作完全正常.但是,在我强行杀死我的进程的情况下,我调用proc_terminate来执行此操作.我知道进程的终止也会继续并关闭所有I/O管道,但问题是由于回调,我的"onExit"函数进程总是被调用(这就是我希望它的方式.. .as我需要做更多的处理).现在,在这种情况下,当我尝试关闭管道时,我收到以下错误:
fclose(): 18 is not a valid stream resource
Run Code Online (Sandbox Code Playgroud)
我尝试使用"ftell"来检查管道是否有效,但是这也是错误的.如何检查管道是否已经关闭?
几个月前,我写了一个用于Linux的CGI应用程序,用于popen()读取命令的输出,然后我关闭管道fclose().
现在,我读到需要使用密切管道pclose().
手册说:
返回值
popen()是一个正常的标准I/O流,除了必须用pclose()而不是 关闭之外,它在所有方面都是fclose(3).
我的代码是这样的:
if ((NULL != (f = popen(command.value, "r")))) {
//do something
fclose(f);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:
我的错误有安全问题吗?该计划目前正在制作中.在测试中它没有做任何问题.真正需要的,用打补丁pclose()来代替fclose()?注意:我只在程序中打开一次PIPE.
今天,在我当地的家里,我做了一些测试,fclose()并pclose()没有返回EOF表示失败.
假设我有以下程序:
#include <stdio.h>
int main () {
FILE * pFile;
pFile = fopen ("myfile.txt","r");
fclose (pFile);
//This never happens: free(pFile)
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我从未见过free(pFile)关闭文件句柄后执行的程序.这是为什么?
我知道既然fclose()没有收到指针pFile,那么它实际上并没有释放指针的内存.我的印象是,如果指针指向动态分配的内存,指针应始终释放内存.为什么没有人free()的文件指针?
所以我正在研究fclose manpage,我的结论是,如果fclose被某些信号中断,根据联机帮助页有没有办法恢复......?我错过了一些观点吗?
通常,使用无缓冲的POSIX功能(打开,关闭,写入等),总有一种方法可以通过重新启动呼叫来从信号中断(EINTR)中恢复; 相反,缓冲调用的文档说明在fclose尝试失败后,另一个尝试有未定义的行为...没有关于如何恢复的提示.如果信号中断fclose,我只是"不幸"吗?数据可能会丢失,我无法确定文件描述符是否实际关闭.我知道缓冲区已被释放,但文件描述符呢?想想大规模的应用程序同时使用很多fd的,并且如果fd没有被正确释放会遇到问题 - >我会假设必须有一个CLEAN解决方案来解决这个问题.
所以我们假设我正在编写一个库,并且不允许使用sigaction和SA_RESTART并且发送了大量信号,如果fclose被中断,我该如何恢复?fclose与EINTR失败后,在循环(而不是fclose)中调用close是不是一个好主意?fclose的文档根本没有提到文件描述符的状态; 但是,UNDEFINED并不是很有帮助...如果fd关闭并且我再次调用close,可能会发生奇怪的难以调试的副作用,所以我宁愿忽略这种情况,因为做了错误的事情......然后再次,那里没有无限数量的文件描述符可用,资源泄漏是某种错误(至少对我而言).
当然我可以检查fclose的一个具体实现,但我不相信有人设计了stdio并且没有想到这个问题?它只是文档是坏的还是这个功能的设计?
这个角落案件真的让我感到困惑:(
gcc (GCC) 4.7.2
c89
Run Code Online (Sandbox Code Playgroud)
是否可以检查文件是否已关闭?
我已经打开了一个文件fopen()并使用了关闭fclose(fd).
在程序运行期间,此文件将被打开和关闭.但是,用户可以通过执行a来终止程序ctrl-c.
当我进入清理程序时,我不知道文件是处于打开还是关闭状态.因此,如果我尝试做fclose(fd)两次,它将堆叠转储.
我一直在扔的一些想法:
- 将状态添加到要打开或关闭的文件,然后检查该状态,意味着更多工作用于这样一个简单的工作.
- 不执行任何操作,因为操作系统将在程序结束时自动清理.
- 是否有访问功能,但这只会检查模式.
提前谢谢了,
以下计划:
#include <stdlib.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
int main() {
fclose( stderr );
printf( "%d\n", fileno( stderr ) );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
显示-1在Ubuntu 11.04和2对ICS 4.0.3模拟器.找不到有关此问题的任何信息 - 我可以在两个平台上使此代码的工作类似吗?freopen上stderr有同样的问题.
更新:
以前的小程序演示了我遇到的实际问题的原因:如果我尝试freopen stderr在不存在的目录中存档,在linux stderr上关闭但在android上它保持打开状态!甚至更多 - 如果我在这个打开的stderr文件中写smth 然后fopen在其他文件stderr上写,我打印的文本将写入此打开的文件.
那么,这个程序:
#include <stdlib.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
# define LOGD( ... ) printf( __VA_ARGS__ ); printf( "\n" )
# ifdef ANDROID
# define HOMEDIR "/data/data/com.myapp/" …Run Code Online (Sandbox Code Playgroud) [问题1]
当我将文件打开到函数中时,通常我会这样做:
int read_file (char *filename)
{
FILE *fin;
if ( !(fin = fopen(filename, "r")) )
return 1;
/* ... */
return fclose(fin);
}
int main ()
{
char filename[100];
if ( read_file(filename) )
{
perror(filename);
exit(1);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
通常0返回值是错误(对吗?)然后我可以将以前的代码更改为:
int read_file (char *filename)
{
FILE *fin;
if ( !(fin = fopen(filename, "r")) )
return 0;
/* ... */
return !fclose(fin);
}
int main ()
{
char filename[100];
if ( !read_file(filename) )
{
perror(filename);
exit(1);
} …Run Code Online (Sandbox Code Playgroud) 在我的程序中,我可能会关闭一个已经关闭的文件.当我fclose对已经关闭的文件执行操作时会发生什么?
如果你不能这样做,如何知道文件是关闭还是打开?
我有2个功能。第一个功能是以写入模式打开一个文件并向其中写入一些内容,然后关闭它。
FILE *fp = fopen("file.txt", "w");
//writing itnot file using fwrite
fclose(fp);
Run Code Online (Sandbox Code Playgroud)
第二个函数以读取模式打开文件,解析内容,然后关闭文件。
FILE *fp = fopen("file.txt", "r");
//parsing logic
fclose(fp);
Run Code Online (Sandbox Code Playgroud)
在 中main,我依次调用function1和function2。
int main()
{
function1();
function2();
return 1;
}
Run Code Online (Sandbox Code Playgroud)
有时,function1 fopen会失败并显示错误号 13,即权限被拒绝。我只是有时观察到这一点。我在 2 秒后引入了一个sleepin ,它开始正常工作,没有任何问题。function1fclose
所以我怀疑文件没有立即发布fclose。睡眠并不是正确的解决办法。谁能建议如何解决这个问题?我在这里给出的示例是一个用例,实际代码在线程环境中运行。