2016-07-12 13 views
0

Ich versuche, Named Pipe zwischen dem Prozess zu kommunizieren. Es verhält sich nicht wie erwartet, es liest immer wieder dieselbe Nachricht.Named Pipe funktioniert nicht wie erwartet. Die gleiche Nachricht wird immer wieder gelesen

Verfahren 1: (erzeugt ein Rohr, und das Lese beginnen, bis es über liest oder liest sie 100 Nachrichten)

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; 

Prozess 2 (Schreiben auf das gleiche Rohr)

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; 

Ausgang Verfahren 1 (manchmal ist es Hi1 und manchmal ist es über

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 sowohl des Prozesses blockiert wird. Kann jemand etwas Licht darüber werfen, warum prcoess 1 eine Nachricht wieder und wieder und wieder liest

+0

Warum schließen und öffnen Sie das Rohr? Versuchen Sie, diese – GMichael

+0

no wegzulassen, wo es erwähnt wird, dass wir nicht schließen und wieder öffnen sollen –

+0

Ja, es wird nicht erwähnt. Aber es ist absolut unnötig. Es macht den Code komplexer und langsamer. – GMichael

Antwort

2

Wenn Sie die fd auf dem schreibenden Teil schließen, empfängt lesen ein Dateiende und gibt 0 zurück (und der Puffer ist nicht geändert, so dass es "Hi" enthält). Sie sollten zumindest nach dieser Bedingung suchen (im Allgemeinen sollten Sie den Rückgabewert von read als Anzahl der tatsächlich gelesenen Bytes verwenden). Im Allgemeinen gibt es keine Garantie, dass es eine perfekte Übereinstimmung zwischen Lesen und Schreiben gibt. "Schreiben" stellt nur Zeichen in die Warteschlange, und "Lesen" erhält bis zu der Zahl, die Sie als dritten Parameter übergeben (MAX_BUF). Was passiert ist also, dass Sie den gesamten Satz von Zeichen in einer einzigen Leseoperation erhalten, und dann erhalten Sie EOF für weitere Lesevorgänge. Es liegt an dir, den Puffer zu teilen und die Teile zu finden.

+0

Sorry es ist tatsächlich, beide Prozesse blockieren. Non-Block ist in beiden Prozessen nicht aktiviert. –

+0

vor dem Schließen, Prozess 2 Hi1 schreiben, wenn das der Fall ist, dann sollte die Nachricht Hi5 sein, oder? nach dem Schließen, wie Prozess 1 warten auf neues Lesen statt EOF. weil, wenn, was dein Sprichwort ist, mein Durchschnitt, liest, liest weiter EOF –

+0

Ich schlage vor, dass Sie auch den Rückgabewert des Lesens drucken. Es würde Ihnen helfen, herauszufinden, was vor sich geht. In jedem Fall sollten Sie diesen Wert verwenden, um zu entscheiden, wie viele Zeichen im Empfangspuffer gültig sind. –

Verwandte Themen