2016-07-12 7 views
0

프로세스간에 통신을 위해 명명 된 파이프를 사용하려고합니다. 예상대로 작동하지 않으며, 동일한 메시지를 반복해서 읽습니다.명명 된 파이프가 예상대로 작동하지 않습니다. 동일한 메시지를 다시 읽고 있습니다.

공정 1 : (a 파이프를 생성하고, 그것을 통해 판독까지 읽기 시작 또는 100 메시지 판독)의

char* myfifo = "/tmp/omgfifo"; 
    if (feature_head == NULL) { 
     vty_out(vty,"%s%s", ERR_STR ,VTY_NEWLINE); 
     return CMD_WARNING ; 
    } 
    vtysh_diag_list_features(feature_head,vty); 
    /* Create UDS connection for ovs-appctl. */ 
    rc = mkfifo(myfifo,0777); 
    if(rc == -1) 
    { 
     vty_out(vty,"mkfifo errorno : %d %s",errno,VTY_NEWLINE); 
    } 
    fd = open(myfifo, O_RDONLY); 
    if(fcntl(fd, F_GETFL) & O_NONBLOCK) 
    { 
     vty_out(vty,"non block is enabled %s",VTY_NEWLINE); 
    } 
    if(fd == -1) 
    { 
     vty_out(vty,"fd errorno : %d %s",errno,VTY_NEWLINE); 
    } 
    else 
    { 
    while(flag) 
    { 
     retval ++; 
     buf[0] = "\0" 
     rc = read(fd,buf,MAX_BUF); 
     if(retval > 100) 
     { 
      flag = 0; 
      break; 
     } 
     if(rc == -1) 
     { 
      flag = 0; 
      vty_out(vty,"read errorno : %d %s",errno,VTY_NEWLINE); 
     } 
     else 
     { 
     if(strlen(buf) > 3 && strcmp(buf,"over")) 
     { 
      vty_out(vty,"gone case %s",VTY_NEWLINE); 
      flag = 0; 
     } 
     vty_out(vty,"%3d:%s %s",retval,buf,VTY_NEWLINE); 
     } 
    } 
    close(fd); 
    } 
    unlink(myfifo); 
    vty_out(vty,"SIGN : done"); 
    return CMD_SUCCESS; 

공정 2 (동일한 파이프 쓰기)

int fd; 
char * myfifo = "/tmp/omgfifo"; 

fd = open(myfifo, O_WRONLY); 
if(fd == -1) 
{ 
    vty_out(vty,"fd errorno : %d %s",errno,VTY_NEWLINE); 
} 
else 
{ 
    if(fcntl(fd, F_GETFL) & O_NONBLOCK) 
{ 
    vty_out(vty,"non block is enabled %s",VTY_NEWLINE); 
} 
    if(write(fd, "Hi", sizeof("Hi"))== -1) 
    { 
     vty_out(vty,"write h errorno : %d %s",errno,VTY_NEWLINE); 
     } 
if(write(fd, "Hi1", sizeof("Hi1"))== -1) 
    { 
     vty_out(vty,"write h1 errorno : %d %s",errno,VTY_NEWLINE); 
     } 

if(write(fd, "over", sizeof("over")) == -1) 
    { 
     vty_out(vty,"write o errorno : %d %s",errno,VTY_NEWLINE); 
     } 
if(write(fd, "Hi2", sizeof("Hi2")) == -1) 
    { 
     vty_out(vty,"write h2 errorno : %d %s",errno,VTY_NEWLINE); 
     } 

if(write(fd, "Hi3", sizeof("Hi3")) == -1) 
    { 
     vty_out(vty,"write h3 errorno : %d %s",errno,VTY_NEWLINE); 
     } 
if(close(fd)!=0) 
{ 
    vty_out(vty,"close errorno : %d %s",errno,VTY_NEWLINE); 
} 
} 

    return 0; 

출력 프로세스 1 (때로는 Hi1이고 때로는 끝났음)

1:Hi 
    2: 
    3: 
    4: 
    5: 
    6: 
    7: 
    8: 
    9: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
26: 
27: 
28: 
29: 
30: 
31: 
32: 
33: 
34: 
35: 
36: 
37: 
38: 
39: 
40: 
41: 
42: 
43: 
44: 
45: 
46: 
47: 
48: 
49: 
50: 
51: 
52: 
53: 
54: 
55: 
56: 
57: 
58: 
59: 
60: 
61: 
62: 
63: 
64: 
65: 
66: 
67: 
68: 
69: 
70: 
71: 
72: 
73: 
74: 
75: 
76: 
77: 
78: 
79: 
80: 
81: 
82: 
83: 
84: 
85: 
86: 
87: 
88: 
89: 
90: 
91: 
92: 
93: 
94: 
95: 
96: 
97: 
98: 
99: 
100: 
SIGN : done 

두 프로세스의 fd가 차단되고 있습니다.prcoess 1이 몇 가지 메시지를 반복해서 읽는 이유에 대해 알려줄 수 있습니까?

+0

왜 파이프를 닫았다가 다시 엽니 다? – GMichael

+0

을 생략하고 언급하지 말고 닫고 다시 열지 마십시오. –

+0

예, 언급되지 않았습니다. 그러나 그것은 절대적으로 불필요합니다. 코드를 복잡하고 느리게 만듭니다. – GMichael

답변

2

쓰기 부분에서 fd를 닫으면 read는 파일 끝을 수신하고 0을 반환합니다 변경되었으므로 "Hi"가 계속 포함됨). 적어도이 조건을 검사해야합니다 (일반적으로 실제로 읽은 바이트 수로 read 값을 사용해야합니다). 일반적으로 읽기와 쓰기가 완벽하게 일치한다는 보장은 없습니다. "쓰기"는 문자를 대기열에 추가하고 "읽기"는 최대 세 번째 매개 변수 (MAX_BUF)로 전달하는 숫자를 수신합니다. 따라서 일어나는 일은 단일 읽기 작업에서 전체 문자 집합을 수신 한 다음 추가 읽기에서 EOF를 얻는 것입니다. 버퍼를 분리하고 부품을 찾는 것은 여러분에게 달려 있습니다.

+0

죄송합니다. 실제로 두 프로세스가 모두 차단됩니다. 둘 다 프로세스에서 비 블록을 사용할 수 없습니다. –

+0

닫히기 전에 프로세스 2가 Hi1을 쓰면 그 경우 메시지가 Hi5가되어야합니까? 종료 후 프로세스 1이 EOF 대신 새 읽기를 기다리는 방법 왜냐하면 ur가 말하는 것이 사실이라면, read는 EOF를 읽는 중이다. –

+0

나는 또한 read의 반환 값을 출력 할 것을 제안한다. 그것은 무슨 일이 일어나고 있는지를 알아 내는데 도움이 될 것입니다. 어쨌든 그 값을 사용하여 수신 버퍼에서 유효한 문자 수를 결정해야합니다. –