- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的“主”函数中有这段代码。
...
int data_size1 = sizeof(dados);
int fdDados = shm_open("/dados", O_CREAT|O_RDWR, S_IRUSR|S_IWUSR);
if (fdDados<0){
perror("shm_open failed");
exit(1);
}
dados* shared_data_dados=(dados*) mmap(NULL, data_size1, PROT_READ|PROT_WRITE, MAP_SHARED, fdDados, 0);
time_t rawtime;
struct tm * timeinfo;
time (&rawtime);
timeinfo = localtime (&rawtime);
char auxMsg[91];
sprintf(auxMsg, "Pid=%d, time=%s", getpid(), asctime(timeinfo));
printf(auxMsg);
strcpy((shared_data_dados->msg), auxMsg);
...
它包括以下.h:
typedef struct {
char msg[101];
} dados;
问题是,当我对结构执行 strcpy 时,它给我一个总线错误。我已经尝试将结构更改为 char*,并将 char* 放在 strcpy 的原始部分,但我仍然遇到相同的错误。printf 打印出正确的“消息”,所以这不应该是问题所在...
感谢任何帮助。
提前致谢!
最佳答案
您需要调用ftruncate(fdDados, SIZE)
定义共享内存对象的大小 (SIZE
),如 man 3 shm_open
中所述手册页。
默认情况下,共享内存对象的大小为零字节。因为您的映射不受共享内存对象的支持,所以对映射的所有访问都会导致生成 SIGBUS
信号。
这与您对文件进行内存映射,然后尝试访问文件末尾之后的映射完全相同。
在mmap()
调用,第二个参数,映射的长度,应该是页面大小的倍数。
您可以通过调用 sysconf(_SC_PAGESIZE)
获取页面大小。不要依赖魔术常量或预处理器宏。
由于上面的 (1) 和 (2),最好通过将所需的共享内存量四舍五入为页面大小的下一个倍数来计算 SIZE
。例如:
static size_t full_pages(const size_t size)
{
size_t page = sysconf(_SC_PAGESIZE);
if (size < page)
return page;
else
if (size % page)
return size + page - (size % page);
else
return size;
}
在你的代码中,
int shared_fd, len;
size_t shared_size;
dados *shared_dados;
shared_size = full_pages(sizeof *shared_dados);
shared_fd = shm_open("/dados", O_CREAT|O_RDWR, S_IRUSR|S_IWUSR);
if (shared_fd == -1) {
fprintf(stderr, "Cannot create shared object '/dados': %s.\n", strerror(errno));
exit(EXIT_FAILURE);
}
if (ftruncate(shared_fd, (off_t)shared_size) == -1) {
fprintf(stderr, "Cannot resize shared object '/dados': %s.\n", strerror(errno));
exit(EXIT_FAILURE);
}
shared_dados = mmap(NULL, shared_size, PROT_READ | PROT_WRITE,
MAP_SHARED, shared_fd, 0);
if (shared_dados == MAP_FAILED) {
fprintf(stderr, "Cannot map shared object '/dados': %s.\n", strerror(errno));
exit(EXIT_FAILURE);
}
if (close(shared_fd) == -1) {
fprintf(stderr, "Error closing shared object '/dados': %s.\n", strerror(errno));
exit(EXIT_FAILURE);
} else
shared_fd = -1;
/* TODO: LOCKING! */
memset(shared_dados->msg, '\0', sizeof shared_dados->msg);
len = snprintf(shared_dados->msg, sizeof shared_dados->msg, "pid=%ld", (long)getpid());
if (len < 0 || len >= (int)sizeof shared_dados->msg) {
/* The string we tried to print was too long to
fit into the shared_dados->msg field. Oops. */
}
请注意,我假设dados
结构中的msg
成员是一个char 数组。如果是指向char的指针,就不行了。 (它将指向某个随机位置。即使您将它设置为指向共享内存对象内在此进程中,它也会指向其他进程中的错误地址,因为映射本质上是在一个随机地址。)
另请注意 TODO: LOCKING!
注释。为确保其他进程只会看到完整的消息,您应该使用例如访问 msg
成员的互斥体。
关于c - 复制到共享内存中的结构时获取 "bus error",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43609779/
所以我有这个要求,它接收一个文档,然后需要在输出中创建一个或多个文档。 在这个过程中,需要判断文档是否已经存在,因为申请创建和更新场景有不同的操作。 在直接代码中,这会很简单(概念上) InputDa
我想知道在 IBM Integration Bus 中存储数据库参数的最佳位置在哪里。例如,如果我们有开发、测试和生产环境,每个环境都有一个单独的数据库(当然),那么如何最好地组织数据库连接属性的更改
我正在从事一个项目,在该项目中,我必须与连接的任何设备(ttyS0、ttyS1 或 ttyUSB0)进行一些串行通信。幸运的是,我遇到了一个非常有用的 stackoverflow 链接:“Simple
企业服务总线(ESB)、.NET 服务总线(Windows Azure AppFabric 服务总线)、NServiceBus、RhinoServiceBus、MassTransit 等。 我试图了解
我现在使用Virtual Box启动VM,版本是5.1.26 r117224(Qt5.6.2),但是当我尝试启动VM时,我看到了下面的错误消息: 00:00:29.246866 VMMDev: Gue
从这个周末开始,我每小时都会从我的服务器收到一封邮件,其中包含以下消息: /etc/cron.hourly/mcelog.cron: mcelog: Cannot access bus thresho
Oracle 是否有两个 ESB 产品:Aqualogic Service Bus 和 Oracle Service Bus,或者 ALSB 是否合并到 Oracle SB 产品中? 最佳答案 目前,
为什么我的 RootManageSharedAccessKey 连接字符串无效? 代码: 执行下面的代码时,我收到有关无效连接字符串的错误: serviceBusClient <- new Servi
一 点睛 消息中间件提供了系统之间的异步处理机制,比如在电商网站上支付订单之后,会触发库存计算,物流调度计算,甚至是营销人员绩效计算,报表统计等,诸如此类的操作一般会耗费比订单购买商品本身更多的时间,
基本了解CANopen网络中PDO映射的概念。它允许广播带有小 header 的实时数据。 它是怎样炼成的?如何设置我的设备以了解如何发送/接收 PDO?我需要某种软件吗? 最佳答案 很多问题的答案取
我想知道我们如何计算某些标准 CAN id 集的软件接受过滤器掩码。如果有人可以用示例解释这一点,那就太好了。还请建议一些链接/ Material 来学习 CAN 堆栈软件实现。 提前致谢。 最佳
什么是消息总线 1. 概念 在微服务架构中,通常会使用轻量级的消息代理来构建一个共用的消息主题来连接各个微服务实例, 它广播的消息会被所有在注册中心的微服务实例监听和消费,也称消息总线 2.
一 点睛 有这样一个场景,就是监控某个硬件设备的运行时数据,然后记录到数据库。 可以这样做:该硬件设备在运行的过程中,将一些性能信息等写入特殊的数据文件中,需要做的就是监控文件的变化,读取最后一行数据
I will use CANOpen in linux. In kernel, linux has socketcan and i have some questions for further im
我想用 corss_compiler D-bus 来武装。 工具链:arm-linux-gcc-3.4.1 配置选项:CC=arm-linux-gcc ./configure --prefix=/op
当您将多个连接连接到节点上的单个输出终端时会发生什么。 我找不到关于此的任何 IBM 文档,但工具包并没有阻止我这样做。 这只是一个例子,但我想知道当您对任何节点执行此操作时的一般行为,而不仅仅是输入
如何创建多个虚拟套接字并将它们链接在一起以创建虚拟总线? 我想模拟一个应用程序,其中许多节点通过 CAN 相互通信。 最佳答案 您所需要的只是 can-utils 中的 cangw 工具。 。创建两个
我正在使用Azure Service Bus SubscriptionClient.OnMessage方法;配置为最多同时处理5条消息。 在代码内,我需要等待所有消息完成处理后才能继续(正确关闭Azu
如何使用 C 列出 D-Bus sessionBus 中的所有名称? 我正在寻找C GIO相当于 dbus.list_names python method 我想列出“org.mpris.MediaP
这个问题已经有答案了: Why does modifying a string literal cause a segmentation fault? [duplicate] (1 个回答) 已关闭
我是一名优秀的程序员,十分优秀!