- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用 SysV 信号量和共享内存 API 应用我的信号量理论知识。
简而言之,我在 50 个进程之间共享 int
大小的内存(由信号量保护),每个进程递增 1000 次,所以最终我必须有一个最终值1000 * 50 = 50000
但奇怪的是我的值如下:49962、49965、49366...
这是我的 C 代码:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#define SHMSZ sizeof(int) /* Size of an integer*/
int main(){
key_t key = 241096; /* Hard-coded key */
int shm_id, sem_id, *shm;
struct sembuf psem = {0, -1, 0};
struct sembuf vsem = {0, 1, 0};
if((shm_id = shmget(key, SHMSZ, IPC_CREAT | 0666)) == -1){
printf("Err shmget");
exit(1);
}
if((shm = shmat(shm_id, NULL, 0)) == (int *) -1){
printf("Err shmat");
}
*shm = 0; /*Initilize the shared memory*/
if((sem_id = semget(key, 1, IPC_CREAT | 0666)) == -1){
printf("Err semget prg");
exit(1);
}
/***Semaphore initialization****/
semop(sem_id, &vsem, 1); /*set sem_value to 1*/
/**********************************/
int i;
for (i = 0; i < 50; i++){
pid_t pid = fork();
if (pid == 0){
int j;
for (j = 0; j < 1000; j++){
semop(sem_id, &psem, 1); /*wait for the semaphore*/
*shm = *shm + 1;
semop(sem_id, &vsem, 1); /* signal the semaphore*/
}
return 0; /*Whene done incrementing, return */
}
}
while((wait(NULL) != -1)); /*Wait for all children to terminate*/
printf("--%i--", *shm); /*Print the final value of the shared memory*/
return 0;
}
最佳答案
我尝试执行您的代码,它按预期打印了 50000。尝试使用 ftok 和 key 在两个不同的共享内存之间生成非冗余 key 。
key_t key = ftok(FileName, AnyChar); // The program must have the right to access the file.
如果您在多次执行可执行文件时得到这些值,那肯定是因为您没有使用 ipcrm -a。此命令将删除您的程序创建的所有新 ipc。
关于c - 使用 SysV 信号量时不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47984534/
调用 semget() 是否会在文件系统中的某处创建一个唯一的文件?我正在尝试使用信号量作为共享内存段的键,并认为 ftok() 可能是一个可行的选择。 最佳答案 没有。 System V IPC 对
我试图通过一个例子来理解计数信号量的概念。但我想在 Linux 中使用 SysV 来实现它。 我熟悉二进制信号量和计数信号量的理论部分。 我已经提到了这个 link . 从概念上讲,信号量用作从一个进
我有一个场景: 1:有一个reader进程和一个writer进程,这些进程通过SysV消息队列进行通信。 2:Writer进程比Reader进程快,也就是说,Writer进程向队列中写入消息的速度比R
为什么这段代码会出现段错误?共享内存IPC SYSV。 int * addr; int shmid = shmget(0xABC, 10*sizeof(int), IPC_CREAT); addr =
从信号处理程序调用 msgsnd 函数安全吗? 我们服务的代码并不打算每次都优雅地完成,所以我没有退出点,但是我需要在服务停止时向另一个进程发送消息,所以我需要捕获 SIGTERM 并执行 msgsn
我正在尝试使用 SysV 信号量和共享内存 API 应用我的信号量理论知识。 简而言之,我在 50 个进程之间共享 int 大小的内存(由信号量保护),每个进程递增 1000 次,所以最终我必须有一个
我正在研究两个遗留的交叉编译的 ARM Linux 构建。除了“使用此 VM 镜像构建源代码”之外,没有太多文档。文件命令输出之间的唯一区别是存在“(SYSV)” # file Executable
我们有一个大型 Fortran/MPI 代码库,它利用节点上的 system-V 共享内存段。我们在具有 32 个处理器的胖节点上运行,但只有 2 或 4 个 NIC,每个 CPU 的内存相对较少;所
我正在尝试用 C 编写一个简单的 shell,它接受一个命令并使用一个子进程来执行该命令。例如,如果我输入: ps -ael 我的子进程应该执行该命令及其参数。我打印出存储在数组中的命令。这是我看到
我正在根据 AMD64 SysV ABI 在汇编中使用 cpuid 实现一个函数。我需要在函数本身中使用 2 个临时寄存器:第一个用于累积返回值,第二个用作计数器。 我的函数目前看起来是这样的: ;z
我从未见过任何项目或任何东西利用 posix或 sysv消息队列 - 很好奇,你们用它们解决了哪些问题或项目? 最佳答案 我有一系列需要按顺序执行的命令,但主程序流程并不依赖于它们的完成,所以我将它们
有什么方法可以用散列样式 SYSV 而不是 GNU/Linux 来编译 GCC 的 libstdc++?我有一个工具链(通过 crosstool-ng),我用它来编译我们公司的库,以便在非常广泛的 L
这段代码我真的遇到了麻烦。我有一个缓冲区和一个方法 Produce() ,它应该是非阻塞的,这意味着当许多进程尝试 Produce() 时,除了一个进程之外,所有这些进程都应该返回/或失败。 我在 m
x86-64 SysV ABI 指定了如何在寄存器中传递函数参数(在 rdi 中的第一个参数,然后是 rsi 等),以及如何将整数返回值传回(在 rax 和然后 rdx 对于非常大的值)。 然而,我找
这是什么错误??:: 根@pc:~# sudo/bin/systemctl 启用 elasticsearch.service 或者 根@pc:~# sudo systemctl 启用 Elastics
需要使用 IPC 将大量数据(200kb+)从 OS X 10.4 及更高版本的子进程传递到父进程,我阅读了 Unix 上的共享内存,特别是 System V 和 POSIX 共享内存机制。然后我意识
cat /proc/sys/kernel/shmmax 18446744073692774399 尝试创建 shmem 内存并在稍后覆盖它以解决 HUGE Dirty COW 漏洞。 不知何故,MAX
chkconfig 的文档对于优先级数字的实际含义有点松散,init 的文档甚至没有提及我的机器上的优先级。 假设您有以下内容: /etc/rc.d/rc3.d/S01foo /etc/rc.d/rc
SysV ABI定义了 Linux 的 C 级和汇编调用约定。 我想编写一个通用的 thunk 来验证函数是否满足被调用者保留寄存器的 ABI 限制,并且(可能)尝试返回一个值。 所以给定一个像 in
我正在尝试在 lindux debian 上安装和配置 systemD,但在安装 systemd-sysv 时出现错误,我知道这是让 systemD 管理服务所必需的。 当我运行时 apt-get i
我是一名优秀的程序员,十分优秀!