2016-10-10 7 views
1

내 C 코드를 파이썬 코드와 통신하려고합니다. 내 C 코드에서 이름 파이프를 만들고 파이썬에 보내면 파이썬이 그것을 출력합니다. 나는 파이썬에서 이름 붙여진 파이프를 만들고 C가 그것을 읽는 것과 같은 일을하고 싶다.하지만 내 프로그램이 멈추는 것처럼 보인다. (나는 이것들을 한 번에하고 싶다.) 그러므로 나는 프로세스를 사용하고있다.프로세스를 사용할 때 프로그램이 멈 춥니 다

내 C 코드 :

int main(void) { 
    int pid; 
    FILE * fp; 
    char *calledPython="./a.py"; 
    char *pythonArgs[]={"python",calledPython,"a","b","c",NULL}; 
    FILE * fp2; 
    char str[40]; 
    pid = fork(); 

    if(pid == 0) { 
     mkfifo("./test",0666); 
     fp = fopen("./test","w"); 
     fprintf(fp,"Hello\n"); 
     fprintf(fp,"World\n"); 
    } 
    else { 
     execvp("python",pythonArgs); 
     // if we get here it misfired 
     perror("Python execution"); 
     kill(pid,SIGKILL); 
    } 

    fp2 = fopen("./test2","r"); 
    if(fp2 == NULL) { 
     printf("NUll\n"); 
    } 

    else { 
     fscanf(fp2, "%s", str); 
     printf("received from test2 %s\n", str); 
    } 
    fclose(fp); 
    return 0; 
} 

내 파이썬 코드 : ./test 초기 네임드 파이프가

#!/usr/bin/python 


import os, sys 

with open("./test") as fp: 
    for line in fp: 
     print line 


path = "./test2" 
os.mkfifo(path) 

fifo = open(path,"w") 
fifo.write("Message from the sender\n") 
fifo.close() 

는 파이썬에서 판독 ./test2 번째 네임드 파이프 C는이다 . 내가 파이썬에서 내 두 번째 파이프에 쓰기 한 번에 읽어 soposed 그러나, 내 프로그램이 중단 :

path = "./test2" 
os.mkfifo(path) 

fifo = open(path,"w") 
fifo.write("Message from the sender\n") 
fifo.close() 

내가 터미널에서 얻을 출력은 : 나는 다시 실행하면

NUll 
Hello 

World 

, 나는 단순히 빈 줄 (아무것도 인쇄 전혀)를 얻는다. 부모 프로세스에서 두 번째 명명 된 파이프를 열려고 시도했지만별로 변하지 않는 것 같습니다. 내가 어디서 잘못 됐는지 모르겠다. 어떤 생각?

+0

이것은 경쟁 조건이 많은 것처럼 보입니다. – melpomene

답변

0

현재 테스트 할 유닉스 박스가 없습니다. 하지만 문제는 부모 프로세스에서 FIFO를 닫지 않는 것입니다.

for line in file과 같은 루프가있을 때마다 해당 루프가 파일이 끝날 때까지 계속됩니다. 일반 파일과 달리 FIFO는 쓰기 끝의 프로세스가 FIFO를 닫을 때까지 "끝내지"않습니다. FIFO를 닫지 않으면 읽기 프로세스가 읽기 호출에서 차단되어 진행할 수 없습니다.

코드에 다른 문제가있을 수 있습니다.

일부 다른 노트 :

  • 당신은 execvp는 전에, 현재 당신이 병렬로 수행하고 파이썬 프로그램이 파일을 열려고 시도하기 전에에서는 mkfifo이 완료 될 것으로 기대하고있다에서는 mkfifo한다

    . 가능성은 있지만 확실하지는 않습니다.

  • 두 번째 FIFO에는 또 다른 경쟁 조건이 있습니다. 의도 한대로 작동하지 않을 가능성이 매우 낮습니다.

  • 다음에 작동하지 않는 이미 존재하는 파일을 만들 때 명명 된 파이프를 제거하지 마십시오.

  • SIGKILL은 올바른 신호를 사용하지 않습니다. SIGKILL, SIGTERM 등의 차이점을 읽어 보는 것이 좋습니다.

  • mkfifo와 같은 시스템 호출은 실패 할 수 있으며 오류의 반환 값을 확인하는 것이 좋습니다.

관련 문제