gpt4 book ai didi

c - 如何在linux上的两个进程之间使用c中的posix命名信号量来共享内存?

转载 作者:行者123 更新时间:2023-11-30 17:09:33 25 4
gpt4 key购买 nike

我正在尝试同步两个进程来读取和写入共享内存。这是a_process.c:

 #include <fcntl.h>
#include <sys/mman.h>
#include <semaphore.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>

#define SHM_PATH "/instant_messaging"
#define SHM_SIZE 50
#define SEM_PATH "/sem_instant_messaging"

char *sendbuff;

int main()
{
//sahred memory setting
//shm_unlink(SHM_PATH);
int shmfd;

shmfd = shm_open(SHM_PATH, O_CREAT | O_RDWR, S_IRWXU | S_IRWXG);
if (shmfd < 0) {
perror("In shm_open()");
exit(1);
}

int shm_size = SHM_SIZE;

ftruncate(shmfd, shm_size);
sendbuff = (char*) mmap(NULL, shm_size, PROT_READ | PROT_WRITE,
MAP_SHARED, shmfd, 0);
if (sendbuff == NULL) {
perror("In mmap()");
exit(1);
}

//semaphore setting
sem_unlink(SEM_PATH);

sem_t * sem1;

sem1 = sem_open(SEM_PATH, O_CREAT, S_IRUSR | S_IWUSR, 1);
printf("before while\n");
//setmemshr();
//setsem();
while (1) {
int status = sem_wait(sem1);

if (status != 0)
{
perror("in sem_wait");
}
printf("after wait\n");
printf("%s\n",sendbuff);
scanf("%s",sendbuff);
sem_post(sem1);
//sleep(3);
}
}

这里是b_process.c:

#include <fcntl.h>
#include <sys/mman.h>
#include <semaphore.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>

#define SHM_PATH "/instant_messaging"
#define SHM_SIZE 50
#define SEM_PATH "/sem_instant_messaging" //dddddddddd

char *sendbuff;

int main()
{
//sahred memory setting
//shm_unlink(SHM_PATH);
int shmfd;

shmfd = shm_open(SHM_PATH, O_CREAT | O_RDWR, S_IRWXU | S_IRWXG);
if (shmfd < 0) {
perror("In shm_open()");
exit(1);
}

int shm_size = SHM_SIZE;

ftruncate(shmfd,shm_size);
sendbuff = (char*) mmap(NULL, shm_size, PROT_READ | PROT_WRITE,
MAP_SHARED, shmfd, 0);
if (sendbuff == NULL) {
perror("In mmap()");
exit(1);
}

//semaphore setting
sem_unlink(SEM_PATH);

sem_t *sem1;

sem1 = sem_open(SEM_PATH, O_CREAT, S_IRUSR | S_IWUSR, 1);

while (1) {
printf("before wait %d\n", *sem1);
int status = sem_wait(sem1);

if (status != 0)
{
perror("in sem_wait");
}
printf("after wait %d\n", *sem1);
printf("%s", sendbuff);
scanf("%s", sendbuff);
sem_post(sem1);
}
}

我花了很多时间调试这个并阅读手册页,但似乎虽然共享内存工作并且信号量在每个进程的地址空间内进行发送和等待工作,但这两个进程中的任何一个都不会影响另一个进程看到的数据在共享内存区域。

有人看到我错过了什么吗?

最佳答案

您的代码中有一些可疑的内容,但其中一个组合显然是错误的:两个进程都执行 sem_unlink() ,然后立即执行 sem_open() 在信号量路径上。仅当您非常幸运时,这才会产生使用相同信号量的两个过程的效果,这样两个 sem_unlink() 都会在执行 sem_open() 之前执行。否则,无论哪个进程第二个执行,都将取消第一个进程创建的信号量的链接,并创建并使用自己的信号量。两个进程都将继续进行,每个进程都使用自己独立的信号量。

我还发现这两个进程 ftruncate() 共享内存区域有点可疑,特别是它们在同步之前这样做(或者如果进程有效同步的话就会这样做)。我认为你应该让一个进程负责设置共享内存段;另一个只需要打开并映射它。更正信号量初始化,并使用信号量确保在任一程序继续使用共享内存之前确定共享内存的大小。

关于c - 如何在linux上的两个进程之间使用c中的posix命名信号量来共享内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33238700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com