【问题标题】:Python and C file read/write simultaneouslyPython 和 C 文件同时读/写
【发布时间】:2012-04-26 10:06:28
【问题描述】:

我有一些 C 代码,我在 Python 中对其进行了扩展。扩展的 C 代码具有将一些结构附加到二进制文件的功能:

void writefunction(const struct struct1* some,const u_char* struct2){
    f=fopen('save.bin',"ab");
    if(f==NULL){
        printf("Unable to open file");
        exit(-1);
    }
    fwrite(some,sizeof(struct struct1),1,f);
    fwrite(struct2,sizeof(u_char),4,f);
    fclose(f);
}

现在我已经在 Python 中导入了代码。我想在 Python 中启动两个线程:一个将运行这个 writefunction(),另一个将读取同一个文件。 writefunction 在一个线程中正常工作,但从文件读取的 Python 函数不工作。

我做错了什么?

【问题讨论】:

  • 你为什么要这样做?您只是想将数据从一个线程传递到另一个线程,还是有理由编写文件?
  • 你的 Python 代码是什么,什么不工作?
  • Python 代码只是一个用于文件读取的代码。我想在线程中同时运行 C 和 python 函数。这是因为 c 的 write 函数正在编写一些只能由 c 完成的东西。
  • 你的 C 函数应该只返回数据给调用者。线程有几种不使用文件进行通信的方式。如果您真的想不出办法,请通过写入管道来传递数据。试图通过磁盘文件同步 i/o 是自虐。

标签: python c multithreading


【解决方案1】:

别这样。

这里的问题是,“save.bin”文件的内容取决于您使用的 C 编译器 - 并且可能取决于您传递给编译器的一些命令行参数。

结构struct1 在内存中的内部保存方式取决于编译器——至少在使用位域时是这样;编译器也可能添加填充(参见下面的示例)。您将内部存储器结构写入文件。

如果您想与用不同语言编写的程序交换数据(并且可能在不同的服务器上运行),您应该使用一些“有线”(序列化)协议来转换它们。

建议:可能选择 JSON 或 XML。

填充结构的示例:

#include <stdio.h>

struct struct1 {
   char a;
   long b;
};

int main() {
   printf("%d %d %d\n", sizeof(char), sizeof(long), sizeof(struct struct1));
   return 0;
}

一个可能的输出是:

1 8 16

【讨论】:

  • 这不一定是真的。某些类型的 C 结构将以独立于编译器的方式布局,但只要结构不使用位域就可以了。
  • 恕我直言,位域完全依赖于编译器——但也是实现特定的不同域之间的填充。重新表述答案并添加一个小的 C 示例。
  • 当我单独运行 c 的 writefunction 时,通过在 python 中扩展它,它会创建文件,我可以使用我的 python 函数读取文件 save.bin。但是我想在 cfunction 写入时同时读取它。有没有办法做到这一点?
猜你喜欢
  • 1970-01-01
  • 2017-06-22
  • 1970-01-01
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 2019-11-01
  • 2013-12-17
  • 1970-01-01
相关资源
最近更新 更多