标签: fclose

多个文件描述符到同一个文件,C

我有一个打开并读取相同文件(不写入)的多线程应用程序.我为每个线程打开一个不同的文件描述符(但它们都指向同一个文件).然后每个线程读取文件并关闭它并在达到EOF时再次打开它.这个可以吗?如果我对文件描述符执行fclose()会影响指向同一文件的其他文件descritptors吗?

multithreading file file-descriptor fclose

7
推荐指数
2
解决办法
6861
查看次数

fclose():18不是有效的流资源

我正在尝试使用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"来检查管道是否有效,但是这也是错误的.如何检查管道是否已经关闭?

php proc-open kill-process fclose

7
推荐指数
1
解决办法
1万
查看次数

使用fclose管道popen是一个严重的错误?

几个月前,我写了一个用于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表示失败.

c linux popen fclose pclose

7
推荐指数
2
解决办法
3276
查看次数

fclose()然后free()?

假设我有以下程序:

#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()的文件指针?

c memory free file fclose

7
推荐指数
2
解决办法
1万
查看次数

对fclose进行适当的错误处理是不可能的(根据联机帮助页)?

所以我正在研究fclose manpage,我的结论是,如果fclose被某些信号中断,根据联机帮助页有没有办法恢复......?我错过了一些观点吗?

通常,使用无缓冲的POSIX功能(打开,关闭,写入等),总有一种方法可以通过重新启动呼叫来从信号中断(EINTR)中恢复; 相反,缓冲调用的文档说明在fclose尝试失败后,另一个尝试有未定义的行为...没有关于如何恢复的提示.如果信号中断fclose,我只是"不幸"吗?数据可能会丢失,我无法确定文件描述符是否实际关闭.我知道缓冲区已被释放,但文件描述符呢?想想大规模的应用程序同时使用很多fd的,并且如果fd没有被正确释放会遇到问题 - >我会假设必须有一个CLEAN解决方案来解决这个问题.

所以我们假设我正在编写一个库,并且不允许使用sigaction和SA_RESTART并且发送了大量信号,如果fclose被中断,我该如何恢复?fclose与EINTR失败后,在循环(而不是fclose)中调用close是不是一个好主意?fclose的文档根本没有提到文件描述符的状态; 但是,UNDEFINED并不是很有帮助...如果fd关闭并且我再次调用close,可能会发生奇怪的难以调试的副作用,所以我宁愿忽略这种情况,因为做了错误的事情......然后再次,那里没有无限数量的文件描述符可用,资源泄漏是某种错误(至少对我而言).

当然我可以检查fclose的一个具体实现,但我不相信有人设计了stdio并且没有想到这个问题?它只是文档是坏的还是这个功能的设计?

这个角落案件真的让我感到困惑:(

c linux stdio eintr fclose

7
推荐指数
1
解决办法
1032
查看次数

检查已使用fopen打开的文件是否已关闭

gcc (GCC) 4.7.2
c89
Run Code Online (Sandbox Code Playgroud)

是否可以检查文件是否已关闭?

我已经打开了一个文件fopen()并使用了关闭fclose(fd).

在程序运行期间,此文件将被打开和关闭.但是,用户可以通过执行a来终止程序ctrl-c.

当我进入清理程序时,我不知道文件是处于打开还是关闭状态.因此,如果我尝试做fclose(fd)两次,它将堆叠转储.

我一直在扔的一些想法:

  1. 将状态添加到要打开或关闭的文件,然后检查该状态,意味着更多工作用于这样一个简单的工作.
  2. 不执行任何操作,因为操作系统将在程序结束时自动清理.
  3. 是否有访问功能,但这只会检查模式.

提前谢谢了,

c fopen fclose

6
推荐指数
1
解决办法
2万
查看次数

fclose在android和linux上的工作方式不同

以下计划:

#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)

linux android fclose android-ndk freopen

5
推荐指数
2
解决办法
1043
查看次数

文件打开时的错误处理

[问题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)

c error-handling fopen file fclose

5
推荐指数
1
解决办法
1万
查看次数

Fclose已经fclose的文件

在我的程序中,我可能会关闭一个已经关闭的文件.当我fclose对已经关闭的文件执行操作时会发生什么?

如果你不能这样做,如何知道文件是关闭还是打开?

c c++ fclose

5
推荐指数
1
解决办法
3684
查看次数

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。睡眠并不是正确的解决办法。谁能建议如何解决这个问题?我在这里给出的示例是一个用例,实际代码在线程环境中运行。

c fopen fclose

5
推荐指数
1
解决办法
4704
查看次数