ipc 相关问题

IPC代表进程间通信,代表一组在线程和进程之间交换数据和消息的方法。

如何在 C 中使用进程间通信进行正确的消息队列?

我尝试在 C 中使用消息队列模拟宾果游戏。 我的程序这样做: 父亲应该分发孩子的卡片,而不是特定的顺序。 孩子们收到卡片并将其打印在

回答 1 投票 0

如何在守护进程中使用具有多个进程的单个命名管道 - Bash 中的客户端 IPC?

我正在尝试编写一个脚本来启动一个守护进程,该守护进程同时通过两个命名管道 $FIFO.out 和 $FIFO.in 分别传输其输出和输入。我想做的是给客户进程

回答 1 投票 0

如何在 Electron 中启动网络套接字并从 utilityProcess 发回数据

我正在尝试使用新的 utilityProcess 模块进行后台工作,而不是 Electron 中的隐藏渲染器。 我似乎找不到任何好的例子。使用。该文档相当简洁。

回答 0 投票 0

ctrl c时如何删除共享内存?

我写了一个 shm 结构如下: 类 ShmWorker { 民众: ShmWorker() = 默认值; 虚拟 ~ShmWorker() { shmdt(m_data); shmctl(shmid, IPC_RMID, 0); // 这就是问题所在...

回答 1 投票 0

如何在不同conda环境的两个不同python进程之间交换数据?

A 和 B 两个 python 脚本存在兼容性问题,需要为它们提供单独的 conda 环境。这是场景。当脚本 A 运行时,它向进程 B 发送数据(脚本 B 运行在一个

回答 2 投票 0

在进程之间共享条件变量和互斥量:之前是否必须锁定互斥量?

我需要一些帮助来理解如何在 C 中使用条件变量来解决练习。这是一个小例子: #包括 #包括 #包括 我需要一些帮助来理解如何在 C 中使用条件变量来解决练习。这是一个小例子: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> #include <string.h> #include <errno.h> #include <sys/types.h> #include <sys/mman.h> #include <sys/stat.h> #include <fcntl.h> #define OKTOWRITE "/oktowrite" #define MESSAGE "/message" #define MUTEX "/lock" int main(int argc, char** argv) { pthread_cond_t* condition; pthread_mutex_t *mutex; char* message; int des_cond, des_msg, des_mutex; int mode = S_IRWXU | S_IRWXG; des_mutex = shm_open(MUTEX, O_CREAT | O_RDWR | O_TRUNC, mode); if (des_mutex < 0) { perror("failure on shm_open on des_mutex"); exit(1); } if (ftruncate(des_mutex, sizeof(pthread_mutex_t)) == -1) { perror("Error on ftruncate to sizeof pthread_cond_t\n"); exit(-1); } mutex = (pthread_mutex_t*) mmap(NULL, sizeof(pthread_mutex_t), PROT_READ | PROT_WRITE, MAP_SHARED, des_mutex, 0); if (mutex == MAP_FAILED ) { perror("Error on mmap on mutex\n"); exit(1); } pthread_mutex_init(mutex, NULL ); des_cond = shm_open(OKTOWRITE, O_CREAT | O_RDWR | O_TRUNC, mode); if (des_cond < 0) { perror("failure on shm_open on des_cond"); exit(1); } if (ftruncate(des_cond, sizeof(pthread_cond_t)) == -1) { perror("Error on ftruncate to sizeof pthread_cond_t\n"); exit(-1); } condition = (pthread_cond_t*) mmap(NULL, sizeof(pthread_cond_t), PROT_READ | PROT_WRITE, MAP_SHARED, des_cond, 0); if (condition == MAP_FAILED ) { perror("Error on mmap on condition\n"); exit(1); } pthread_cond_init(condition, NULL ); if (!fork()) { sleep(3); pthread_mutex_lock(mutex); pthread_cond_signal(condition); pthread_mutex_unlock(mutex); printf("son signaled\n"); exit(0); } else { printf("wait on condition\n"); pthread_mutex_lock(mutex); pthread_cond_wait(condition, mutex); pthread_mutex_unlock(mutex); printf("Signaled by son process, wake up\n"); pthread_mutex_destroy(mutex); pthread_cond_destroy(condition); shm_unlink(OKTOWRITE); shm_unlink(MESSAGE); shm_unlink(MUTEX); return 0; } } 问题是进程的父亲继续被锁定,即使在儿子发出信号之后也是如此。一切都在共享内存中(使用shm_open和mmap)所以两个进程的条件应该相同。 在调用 wait 或 signal 之前锁定互斥锁可能是我犯了一个错误吗? 编辑: 感谢所有帮助过我的人。这是标有关键部分的正确代码: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> #include <string.h> #include <errno.h> #include <sys/types.h> #include <sys/mman.h> #include <sys/stat.h> #include <fcntl.h> #define OKTOWRITE "/condwrite" #define MESSAGE "/msg" #define MUTEX "/mutex_lock" int main(int argc, char** argv) { pthread_cond_t* condition; pthread_mutex_t* mutex; char* message; int des_cond, des_msg, des_mutex; int mode = S_IRWXU | S_IRWXG; des_mutex = shm_open(MUTEX, O_CREAT | O_RDWR | O_TRUNC, mode); if (des_mutex < 0) { perror("failure on shm_open on des_mutex"); exit(1); } if (ftruncate(des_mutex, sizeof(pthread_mutex_t)) == -1) { perror("Error on ftruncate to sizeof pthread_cond_t\n"); exit(-1); } mutex = (pthread_mutex_t*) mmap(NULL, sizeof(pthread_mutex_t), PROT_READ | PROT_WRITE, MAP_SHARED, des_mutex, 0); if (mutex == MAP_FAILED ) { perror("Error on mmap on mutex\n"); exit(1); } des_cond = shm_open(OKTOWRITE, O_CREAT | O_RDWR | O_TRUNC, mode); if (des_cond < 0) { perror("failure on shm_open on des_cond"); exit(1); } if (ftruncate(des_cond, sizeof(pthread_cond_t)) == -1) { perror("Error on ftruncate to sizeof pthread_cond_t\n"); exit(-1); } condition = (pthread_cond_t*) mmap(NULL, sizeof(pthread_cond_t), PROT_READ | PROT_WRITE, MAP_SHARED, des_cond, 0); if (condition == MAP_FAILED ) { perror("Error on mmap on condition\n"); exit(1); } /* HERE WE GO */ /**************************************/ /* set mutex shared between processes */ pthread_mutexattr_t mutexAttr; pthread_mutexattr_setpshared(&mutexAttr, PTHREAD_PROCESS_SHARED); pthread_mutex_init(mutex, &mutexAttr); /* set condition shared between processes */ pthread_condattr_t condAttr; pthread_condattr_setpshared(&condAttr, PTHREAD_PROCESS_SHARED); pthread_cond_init(condition, &condAttr); /*************************************/ if (!fork()) { sleep(10); pthread_mutex_lock(mutex); pthread_cond_signal(condition); printf("son signaled\n"); pthread_mutex_unlock(mutex); exit(0); } else { printf("father waits on condition\n"); pthread_mutex_lock(mutex); pthread_cond_wait(condition, mutex); pthread_mutex_unlock(mutex); printf("Signaled by son process, wake up!!!!!!!!\n"); pthread_condattr_destroy(&condAttr); pthread_mutexattr_destroy(&mutexAttr); pthread_mutex_destroy(mutex); pthread_cond_destroy(condition); shm_unlink(OKTOWRITE); shm_unlink(MESSAGE); shm_unlink(MUTEX); } return 0; } 要在进程之间共享,需要通过正确初始化的属性相应地初始化互斥量:http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_setpshared.html #include <pthread.h> ... pthread_mutex_t * pmutex = NULL; pthread_mutexattr_t attrmutex; /* Initialise attribute to mutex. */ pthread_mutexattr_init(&attrmutex); pthread_mutexattr_setpshared(&attrmutex, PTHREAD_PROCESS_SHARED); /* Allocate memory to pmutex here. */ /* Initialise mutex. */ pthread_mutex_init(pmutex, &attrmutex); /* Use the mutex. */ /* Clean up. */ pthread_mutex_destroy(pmutex); pthread_mutexattr_destroy(&attrmutex); (为了本示例的可读性,省略了错误检查) 这同样适用于应该在进程之间共享的条件变量:http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_condattr_setpshared.html #include <pthread.h> ... pthread_cond_t * pcond = NULL; pthread_condattr_t attrcond; /* Initialise attribute to condition. */ pthread_condattr_init(&attrcond); pthread_condattr_setpshared(&attrcond, PTHREAD_PROCESS_SHARED); /* Allocate memory to pcond here. */ /* Initialise condition. */ pthread_cond_init(pcond, &attrcond); /* Use the condition. */ /* Clean up. */ pthread_cond_destroy(pcond); pthread_condattr_destroy(&attrcond); (为了本示例的可读性,省略了错误检查) 另请参阅此答案:https://stackoverflow.com/a/2390670/694576 等待一个条件之前应该有一个 while 语句,像这样: pthread_mutex_lock(mutex); while(!conditionSatisfied) pthread_cond_wait(condition, mutex); pthread_mutex_unlock(mutex); while 信号应该通过以下方式完成: pthread_mutex_lock(mutex); conditionSatisfied = true; pthread_cond_signal(condition); pthread_mutex_unlock(mutex); 是的,必须在pthread_cond_wait之前锁定互斥量,但不必为pthread_cond_signal锁定。如果你回头看看你的代码,你会发现互斥量将被解锁两次,这是错误的标志......孩子也有可能在已被父母破坏的互斥量上调用解锁...... 顺便说一下,睡眠并不能保证父进程会先执行。为了确保这一点,您将需要……一个条件变量……

回答 3 投票 0

将 std::mutex 放在共享内存中是个好主意吗?

我想设计一个共享内存来在多个进程之间传递数据。 在多线程中,我需要 pthread_mutex_t 来投影临界区。 所以我想在...中分配一个 pthread_mutex_t

回答 0 投票 0

尝试在 Windows 10 中打开现有命名管道 - errno 22,无效参数,但为什么呢?

我正在编写/试验需要连接到 Windows 10 中现有命名管道的 python 脚本。我正在使用 Python 3.8。 命名管道 具体来说,我正在尝试连接到名为

回答 1 投票 0

UWP 服务器 - 进程间通信 - 技术选择

我们有一个 UWP(Microsoft Store 分布式)应用程序,我们的客户希望通过他的软件进行控制。主要目标是客户可以控制应用程序(就好像用户会进行交互

回答 0 投票 0

在同时写入期间是否可以从管道读取部分数据?

在管道通信通道中,如果一个进程向管道写入的字节少于PIPE_BUF,那么从同一个管道读取的另一个进程的读操作是否可以同时看到一部分

回答 0 投票 0

由于写入延迟,是否可以从管道读取部分数据?

我有这样一种情况,一个进程每 100 毫秒将 512 字节的数据写入管道,而另一个进程不断地从同一个管道读取数据。读取完整需要三个读取操作...

回答 0 投票 0

在 Linux 中从共享相同文件描述符的多个线程写入同一个管道是线程安全的吗?

我有一个有两个线程的 Linux 进程,它们共享同一个文件描述符,每 100 毫秒将 400 字节的数据写入同一个管道。我想知道 POSIX 是否保证这是线程安全的或...

回答 2 投票 0

启动使用来自 Python 进程的数据维护 B 树的 C/C++ 进程

我正在用 Python 实现一个数据库,并希望通过 B 树为某些属性维护二级索引。有没有一种方法可以初始化为 P...维护 B 树的 C 或 C++ 进程?

回答 0 投票 0

POSIX共享内存--自动通知客户端的方法

我正在研究用POSIX共享内存来代替POSIX消息队列进行IPC。我计划制作一个足够大的共享内存区域,以容纳50条每条750字节的消息。这些消息将在...

回答 1 投票 0

在Ruby中可以使用IO.pipe进行线程间通信吗?

在文档中的Ruby IO.pipe例子中,一个消息是通过进程传递的。我想做一些类似的事情,但有两个区别:使用线程而不是进程使用一个......。

回答 1 投票 1

C# [在Unity中]和C++之间的命名管道。

我目前正在Unity中开发一个与C++通信的脚本,以接收字节流。目前,我正在开发一个示例,其中两个进程交流一个标准信息,...

回答 1 投票 0

确保父进程在python中崩溃时,子进程会被杀死。

我有一个应用程序,其中一个父进程轮询服务器以获得下载作业,然后生成子进程来完成作业,这个循环持续下去,直到有一些作业被 ...

回答 1 投票 0

如何使用命名管道(C++服务器,C#客户端)

我正试图开始使用命名管道,因为我将来需要在我的一个项目中使用它们。目前我有一个C++服务器,它一直等到客户端连接,然后......。

回答 2 投票 3

Android中两个进程之间如何共享相同的代码?

我在我的android项目中有一个util类,它看起来是这样的,public class MyUtil { public static final String TAG = "tim"; static IBinder mIBinder1 = new Binder(); public ...

回答 1 投票 1

命名管道和mailslot(邮箱)有什么区别?

看来这2种IPC机制彼此之间非常相似,它们之间有什么区别吗?

回答 2 投票 3

© www.soinside.com 2019 - 2024. All rights reserved.