2012-04-14 4 views
0

파이썬에서 확장 한 C 코드가 있습니다. 확장 된 C 코드는 이진 파일에 구조를 추가하는 함수를 가지고 있습니다 :파이썬과 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); 
} 

이제 파이썬에서 코드를 가져 왔습니다. 파이썬에서 두 개의 스레드를 시작하고 싶습니다. 하나는이 writefunction()을 실행하고 다른 하나는 같은 파일을 읽습니다. 쓰기 함수는 한 스레드에서 올바르게 작동하지만 파일에서 읽는 Python 함수가 작동하지 않습니다.

내가 뭘 잘못하고 있니?

+0

왜이 작업을 수행하려고? 한 스레드에서 다른 스레드로 데이터를 전달하려고합니까, 아니면 파일을 쓰는 이유가 있습니까? – steveha

+2

파이썬 코드 란 무엇이며 작동하지 않는 것은 무엇입니까? –

+0

파이썬 코드는 단순히 파일을 읽는 코드입니다. 스레드에서 C와 Python 함수를 모두 실행하려고합니다. 이것은 c write 함수가 c로만 수행 할 수있는 무언가를 작성하기 때문입니다. –

답변

0

하지 마십시오.

'save.bin'파일의 내용은 사용중인 C 컴파일러에 따라 다르며 컴파일러에 전달하는 일부 명령 줄 매개 변수에 따라 달라질 수 있습니다.

구조체 struct1이 내부적으로 메모리에 보관되는 방식은 컴파일러에 따라 다릅니다 (최소한 비트 필드를 사용할 때). 또한 컴파일러가 패딩을 추가 할 수도 있습니다 (아래 예 참조). 내부 메모리 구조를 파일에 씁니다.

다른 언어로 작성된 프로그램 (다른 서버에서 실행중인 프로그램)과 데이터를 교환하려면 'wire'(직렬화) 프로토콜을 사용하여 변환해야합니다.

제안 : 어쩌면 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 
+0

그건 반드시 사실이 아닙니다. 어떤 종류의 C 구조체는 컴파일러 독립적 인 방법으로 배치되지만 구조체가 비트 필드를 사용하지 않는 한 괜찮습니다. –

+0

IMHO 비트 필드는 완전히 컴파일러에 따라 다르지만 구현에 따라 다른 필드 사이의 패딩도 다릅니다. 답을 재구성하고 작은 C 예를 추가하십시오. –

+0

파이썬에서 확장하여 c의 write 함수를 개별적으로 실행할 때 파일을 만들고 파이썬 함수를 사용하여 save.bin 파일을 읽을 수 있습니다. 하지만 cfunction을 쓸 때 동시에 읽고 싶습니다. 이 일을 할 수있는 방법이 있습니까? –

관련 문제