프로세스간에 통신을 위해 명명 된 파이프를 사용하려고합니다. 예상대로 작동하지 않으며, 동일한 메시지를 반복해서 읽습니다.명명 된 파이프가 예상대로 작동하지 않습니다. 동일한 메시지를 다시 읽고 있습니다.
공정 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이 몇 가지 메시지를 반복해서 읽는 이유에 대해 알려줄 수 있습니까?
왜 파이프를 닫았다가 다시 엽니 다? – GMichael
을 생략하고 언급하지 말고 닫고 다시 열지 마십시오. –
예, 언급되지 않았습니다. 그러나 그것은 절대적으로 불필요합니다. 코드를 복잡하고 느리게 만듭니다. – GMichael