当前位置: 首页 > 面试题库 >

可以使用fopen将多个进程追加到文件中,而没有任何并发​​问题吗?

范翰池
2023-03-14
问题内容

我有一个在追加模式下打开文件的过程。在这种情况下,它是一个日志文件。样例代码:

int main(int argc, char **argv) {
    FILE *f;
    f = fopen("log.txt", "a");
    fprintf(f, "log entry line");
    fclose(f);
}

两个问题:

  1. 如果我有多个附加到同一文件的进程,那么每个日志行会以不同的方式显示吗,或者在进程上下文切换时是否可以将它们交错?
  2. 如果许多进程需要访问文件,从而导致并发问题,此写操作会阻塞吗?

我正在考虑以最简单的方式来执行此操作,或者考虑使用zeromq通过管道将日志条目泵送到日志收集器。

我确实考虑过syslog,但是我真的不希望该软件有任何平台依赖性。

此btw的默认平台是Linux。


问题答案:

您肯定会具有平台依赖性,因为Windows无法处理附加到同一文件的多个进程

关于同步问题,我认为行缓冲输出/应该/可以在大多数时间内为您节省时间,也就是说,根据我的基于shell的简短测试,应该完整保留99.99%以上的短日志行,但并非每次都可以。显式语义绝对是可取的,并且由于无论如何您将无法独立编写此hack系统,因此我建议使用syslog方法。



 类似资料:
  • 问题内容: 我有多个JAR文件,必须将其添加到Eclipse中的classpath中。 是否可以将30个文件合并为一个文件并包含该文件? 问题答案: 您可能想看看jarjar。 如果您使用Ant任务,也可以进行以下操作:

  • 问题内容: 我当前正在提取war文件的内容,然后将一些新文件添加到目录结构中,然后创建一个新的war文件。 所有这些都是通过Java以编程方式完成的-但我想知道,复制war文件然后追加文件是否会更有效-那么只要战争扩大,我就不必等待,再次被压缩。 但是,在文档或任何在线示例中,我似乎都找不到找到此方法的方法。 任何人都可以给一些提示或指示吗? 更新: 答案之一中提到的TrueZip似乎是一个非常好

  • < code>fd.append("upload ",file)产生, 产生, 但我需要这个, 这是我的代码:

  • 问题内容: 我正在编写一个将多个线程的行附加到同一文件的应用程序。 我有一个问题,其中某些行被追加而没有新行。 有什么解决办法吗? 问题答案: 解决方案是仅在一个线程中写入文件。

  • 我有一些具有相同列标题的CSV文件。例如 文件A 文件B 我想合并它,以便将数据合并到一个文件中,标题在顶部,但其他地方没有标题。 实现这一目标的好方法是什么?

  • 问题内容: 如何在注入Jenkins时将文本追加到文件中 我希望看到 25在哪里 这是我的尝试 错误: 版本:= 1.0。$ {env.BUILD_ID}:替换错误 注意文件在当前目录中 问题答案: 是一个groovy变量,而不是一个shell变量。由于您使用了单引号(),因此groovy 不会 替换字符串中的变量,并且Shell也不知道。您需要使用双引号并让groovy进行替换 或使用外壳程序知