- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在学习 IPC 编程。作为其中的一部分,我尝试了以下两个代码来了解消息队列....
消息队列创建者或消息发送者
struct my_msgbuf {
long mtype;
char mtext[200];
};
int main(void)
{
struct my_msgbuf buf;
int msqid;
key_t key;
if ((key = ftok("kirk.c", 'B')) == -1) {
perror("ftok");
exit(1);
}
if ((msqid = msgget(key, 0644 | IPC_CREAT)) == -1) {
perror("msgget");
exit(1);
}
printf("Enter lines of text, ^D to quit:\n");
buf.mtype = 1; /* we don't really care in this case */
while(fgets(buf.mtext, sizeof buf.mtext, stdin) != NULL) {
int len = strlen(buf.mtext);
/* ditch newline at end, if it exists */
if (buf.mtext[len-1] == '\n') buf.mtext[len-1] = '\0';
if (msgsnd(msqid, &buf, len+1, 0) == -1) /* +1 for '\0' */
perror("msgsnd");
}
if (msgctl(msqid, IPC_RMID, NULL) == -1) {
perror("msgctl");
exit(1);
}
return 0;
}
消息接收者
struct my_msgbuf {
long mtype;
char mtext[200];
};
int main(void)
{
struct my_msgbuf buf;
int msqid;
key_t key;
if ((key = ftok("kirk.c", 'B')) == -1) { /* same key as kirk.c */
perror("ftok");
exit(1);
}
if ((msqid = msgget(key, 0644)) == -1) { /* connect to the queue */
perror("msgget");
exit(1);
}
printf("spock: ready to receive messages, captain.\n");
for(;;) { /* Spock never quits! */
if (msgrcv(msqid, &buf, sizeof(buf.mtext), 0, 0) == -1) {
perror("msgrcv");
exit(1);
}
printf("spock: \"%s\"\n", buf.mtext);
}
return 0;
}
以上代码可以在beej's guide for message queue找到.
当我尝试执行“spock”时,msgget() 抛出错误:没有这样的文件或目录。 ftok() 有什么问题吗?我将文件的权限更改为传递给 msgget() 函数的权限。但是同样的错误。提前致谢。提前致谢。
最佳答案
ftok
要求文件存在,因为它使用 inode
信息来构造 key 。如果您在单独的目录中构建它们,则使用相对路径指向 kirk.c
应该可以正常工作,例如spock/spock.c
包含 spock 代码,kirk/kirk.c
包含 kirk 代码,在 spock/spock.c
你应该引用到 ../kirk/kirk.c
关于c - msgget() 和 ftok() 出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14120080/
key_t ftok(const char *pathname, int proj_id); 如果我使用文件名作为第一个参数而不是路径名会怎样?例如我的程序在以下目录/afs/edu/id/group
我正在使用 ftok() 为 C 应用程序使用的共享内存段生成标识符。我有问题,在一个盒子上我与 root 使用的标识符发生冲突。在这种情况下,我可以通过破解代码来修复它,但我想要一个更强大的解决方案
我已经开始阅读 Linux 上的 IPC 机制之一的消息队列。但在第一步,我有一些非常基本的问题。 使用ftok()生成唯一ID( key )以及要生成的唯一ID是什么。 我们不能使用简单的数字来获取
我在系统中有一个现有代码,它使用 ftok() 根据文件名和传递给它的零生成 key 。该代码在 32 位上运行良好,但在移动到 64 位时开始随机提示。经过更多研究,我发现这主要是因为较低的有效位为
在ftok()手册中有提到 key_t ftok(const char *pathname, int proj_id); ftok() 函数使用由给定路径名命名的文件的标识(必须引用现有的可访问文件)
我对 ftok() 和 IPC_PRIVATE 生成的 key 有一些疑问。 当我调用 fork() 时, key IPC_PRIVATE 自动由父子共享。对吧? 当我调用 fork() 时,ftok
我正在学习 IPC 编程。作为其中的一部分,我尝试了以下两个代码来了解消息队列.... 消息队列创建者或消息发送者 struct my_msgbuf { long mtype; cha
用于生成 ftok() 生成的 key 的公式是什么? ftok 是一个 Linux 函数,用于为 SYSTEM V IPC 创建 key 。 最佳答案 在ftok from glibc 2.29 :
我遇到了 following program在客户端和服务器之间实现共享内存 IPC。 以下行用于生成唯一的 sysv key (如 here 所述): ShmKEY = ftok(".", 'x')
第二个参数proj_id。这是什么? #include #include key_t ftok (const char *pathname, int proj_id); 最佳答案 关于 ftok
我正在使用 ftok() 创建共享内存 key 。我想创建 500 个共享内存 key 。根据 ftok() 的手册页,提到低 8 位是重要的。 是不是意味着我们最多只能生成256个share mem
我是一名优秀的程序员,十分优秀!