我正在研究用于嵌入式Linux上进程间通信的消息队列.我想知道为什么我没有使用Linux提供的消息队列如下:
msgctl,msgget msgrcv,msgsnd.
而不是创建共享内存,并与信号量同步?
直接在业务嵌入式产品上使用这组功能有什么缺点?
在具有多个进程的Linux系统中,系统V信号量允许选择SEM_UNDO,以防止信号量在持有信号量的进程崩溃时"卡住".什么是防止POSIX信号量因持有信号量的进程中的崩溃而卡住的正确方法?或者POSIX是否保证在崩溃的情况下释放信号量?
我正在研究标准的Ada POSIX 绑定,以及GNAT的Florist实现。目的是评估遗留应用程序是否可以从它自己使用的 C POSIX 函数的编译指示导入移植到使用标准绑定。最终目标是能够在不更改源代码的情况下在 Solaris 和 Linux 中重新编译应用程序。我的疑问是 UNIX 传统中用于进程间通信功能的几组接口,如信号量、消息队列等。 Florist 正在导入这些 C 函数:
当应用程序导入这些其他集合时: - 信号量:semget semop semctl - 消息队列:msgctl msgrcv msgsnd
一些来源将应用程序使用的集合定义为 System V 而不是 POSIX,而在其他来源中,它们被IEEE Std 1003.1-2001声明为标准化,这显然是 POSIX。
我的问题是:
我刚刚学习如何使用消息队列,但我在使用它们时遇到了一些困难。我使用两个完全独立的应用程序来进行测试——一个是“发送者”,另一个是“接收者”。
当我运行发送器时,它向管道发送 15 个字符串,但随后失败并出现“资源暂时不可用”错误。我只需要在接收方消费消息,但为什么只有 15 条消息?我可能会发送大量消息,因此我想将其增加到更大的数量,例如 1000 条左右。
我尝试将消息队列大小设置为 32767,因此我期望至少为 31,但显然msg_qbytes与可以缓冲的消息数量无关。
发送者代码如下所示:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>
#include <string.h>
#define MESSAGE_SIZE 1024
typedef struct msgbuf
{
long mtype;
char mtext[MESSAGE_SIZE];
};
int main(int argc, char *argv[]) {
int msgid;
int ret;
struct msqid_ds msg_settings;
long key;
struct msgbuf msg;
key = strtol(argv[1], NULL, 10);
// print the message queue ID for reading via msgrcv
printf( "Getting message queue with key = …Run Code Online (Sandbox Code Playgroud) 我正在阅读POSIX和System V信号量之间的区别,我也阅读了一些文章.在每篇文章中都写了这样的语句:"如果你需要在一个步骤中实现具有多个递增 - 递减的原子操作,那么System V信号量是有益的."
我的问题是:
1)在单个原子操作中需要多次递增/递减?你能用一个例子解释一下吗?
2)为什么semop允许将值改变为小于-1且大于+1的值?是否有任何实际用法/例子?
(我知道使用System V信号量中的semop()函数,我可以让信号量增加或减少指定值,而不是信号量数组中的一个信号量,并且sem_wait()或sem_post()的信号量不能相同. POSIX信号量.但它的用途是什么?)
我读过的文章供你参考:
1)http://www.ibm.com/developerworks/library/l-semaphore/
3)http://www.linuxdevcenter.com/pub/a/linux/2007/05/24/semaphores-in-linux.html?page=4
4)http://linuxtips.pbworks.com/w/page/29023300/SystemV%20vs%20Posix%20IPC
更新:
我已经阅读了以下文章,其中提到了使用semop()对信号量的多次递增/递减,但我仍然无法获得相同的示例/实际用法.文章供您参考:
1)http://kaharris.org/teaching/51081/Assignments/Final/systemV.pdf
文章的摘录:(标题为"多个信号量操作示例")
"System V信号量的强大之处在于它们可用于在一次操作中以原子方式检查和设置多个信号量."
他还提供了一小部分内容.但没有相同的实际用法.
2)http://www.anirudhtom.com/2011/02/system-v-semaphores-for-babies.html
作者在原子操作中编写了一个代码,用于在"实现一组SEMHHORE"标题下多次递增/递减信号量.这里仍然没有提到它的实际用法.
摘录自本书:
"在UNIX System V中,信号量机制进行了一些调整.操作原子性被保留.但是操作的增加或减少值可能大于1.(为什么?有什么用?).甚至更多,进程可以做多个信号量当多个进程同时竞争许多不同的资源时,同时进行操作以避免死锁问题.(如何?示例?)"
我希望这会使问题更加明确.
如果您对所提出的问题有任何疑问,请发表评论.
提前致谢!
我已经实现了一个用于插入到用于预订服务的数据库表中的访问控制。它可以正常工作一段时间,然后sem_get()尽管我sem_release()在每个sem_get().
case 'room':
$key = "room";
$semaphore = sem_get($key, 1, 0666, 1);
if ($semaphore) {
sem_acquire($semaphore);
//do some stuff
if ($already_reserved_rooms < $max_rooms) {
$return="ok";
sem_release($semaphore);
return $return;
}
sem_release($semaphore);
}
else {
//send me mail that semaphore failed
}
return 'no rooms';
break;
Run Code Online (Sandbox Code Playgroud)
我sem_remove()也应该打电话吗?
我按照这个网站上的步骤。
用于生成 ftok() 生成的密钥的公式是什么?ftok 是一个用于为 SYSTEM V IPC 创建密钥的 Linux 函数。