我正在测试运行在同一台机器上的两个C程序之间的IPC示例(来自here).以下是消息作者和读者的两条主线:
Bar.c(作者)
// bar.c -- C Program for Message Queue (Writer Process)
#include <cstdio>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <cstring>
using namespace std;
// structure for message queue
struct mesg_buffer {
long mtype;
char mtext[100];
};
int main()
{
mesg_buffer message;
message.mtype = 1;
strcpy(message.mtext, "Hello Process!");
// ftok to generate unique key
key_t key = ftok("dummy.txt", 65);
if (key < 0)
printf("Bad key!\n");
// msgget creates a message queue and returns identifier
int msgid = msgget(key, 0666 | IPC_CREAT);
// msgsnd to send message and echo to console:
msgsnd(msgid, &message, sizeof(message), 0);
printf("Data send is : %s \n", message.mtext);
return 0;
}
Foo.c(阅读器)
// foo.c -- C Program for Message Queue (Reader Process)
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/msg.h>
// structure for message queue
struct mesg_buffer {
long mtype;
char mtext[100];
};
int main()
{
mesg_buffer message;
// ftok to generate unique key
key_t key = ftok("dummy.txt", 65);
if (key < 0)
printf("Bad key!\n");
// msgget creates a message queue and returns identifier
int msgid = msgget(key, 0666 | IPC_CREAT);
// msgrcv to receive message
msgrcv(msgid, &message, sizeof(message), 1, 0);
printf("Data Received is : %s \n", message.mtext);
// to destroy the message queue
msgctl(msgid, IPC_RMID, NULL);
return 0;
}
我运行了这两个程序,但出现了"Bad Key"错误,因为我的文件系统上没有"ummy.txt".尽管如此,程序仍在继续,我得到了一个很好的IPC:
penelope:~/test/build/bin$ ./bar
Bad key!
Data send is : Hello Process!
和在单独的终端中:
penelope:~/test/build/bin$ ./foo
Bad key!
Data Received is : Hello Process!
因此,即使有键错误,我也成功地进行了IPC.
现在我定义了dummy.txt
(我不知道我为什么需要它),然后再次运行这对.foo
和bar
运行时没有"Bad Key"错误,但foo
挂起等待通信.
为了努力理解ftok
在做什么,我将这些行改为以下几行:
巴.c:key_t key = ftok(nullptr, 66);
Foo.c:key_t key = ftok(nullptr, 65);
<;--注意不同的索引
我在两者中都得到了"Bad Key"错误,但IPC工作正常.这是怎么回事?如果ftok
键在程序中甚至都不是有效的,这两个进程在这里如何通信?当 keys 看起来有效时,它就不起作用了吗?