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
Warum schließen und öffnen Sie das Rohr? Versuchen Sie, diese – GMichael
no wegzulassen, wo es erwähnt wird, dass wir nicht schließen und wieder öffnen sollen –
Ja, es wird nicht erwähnt. Aber es ist absolut unnötig. Es macht den Code komplexer und langsamer. – GMichael