ipc 相关问题

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

dotnet core 创建文件名中不含“CoreFxPipe_”的命名管道

使用 dotnet core 的 NamedPipeClientStream 或 NamedPipeServerStream 类创建命名管道时,关联的“管道”(看起来实际上是一个套接字)已将“CoreFxPipe_”添加到

回答 2 投票 0

如何保证不同块共享内存之间的数据可用性

我使用 mmap 映射文件以在进程之间共享数据,然后使用另一个共享内存在数据准备好时通知进程。在共享内存中创建一个信号量。 数据之后

回答 0 投票 0

共享内存速度

我有两个应用程序(.dll | .exe)。 [流程1] 这个进程就是dll。 这会在注入时在两个进程之间建立通信。 自动共享文件_obj = CreateFileMappingA(

回答 0 投票 0

Python 中的共享内存 IPC

我有两个 C 程序可以在共享内存上传输数据并且它们可以工作。这是数据结构: 结构体SecondData { uint64_t x[16]; uint y; 字节z[16]; 字符w[128]; 用户界面...

回答 0 投票 0

如何实时监控子进程产生的总输出大小?

下面的代码是我正在处理的实际情况的玩具示例1。 (警告:此代码将永远循环。) 导入子流程 导入uuid 类 CountingWriter: def __init__(self, filep...

回答 0 投票 0

Sigsuspend 导致第二个孩子无法在 C 中接收管道消息

我正在开发一个 C 程序,我想用它来实现一个场景,当一个父进程和两个子进程通过为每个子进程保留的两个独立的 FIFO 相互通信时......

回答 0 投票 0

使用 IPC 在 Python 和 C# 之间进行通信的最简单方法?

我有一些 C# 代码需要调用 Python 脚本数千次,每次传递一个字符串,然后期望返回一个浮点数。 python 脚本可以使用任何版本的 Python 运行,...

回答 3 投票 0

将与 FileStream 一起使用的非真正文件对象

我正在使用支持基于简单文件的数据交换协议的第三方应用程序 - 您可以设置提供文件名的数据通道,所述应用程序将打开文件并写入内容

回答 1 投票 0

在 UWP 应用程序中使用 gRPC 的 IPC

我想将 UWP 应用程序与 .NET 6 应用程序通信。根据我的研究,我可以通过 gRPC 作为 IPC 机制来完成。我遵循了这个示例应用程序。这个应用程序在调试模式下运行,但在发布版本中我遇到了

回答 0 投票 0

Qt 线程远程对象

我在嵌入式 Linux 环境中使用 C++ 和 Qt,最近我们的项目更新为使用多个进程,一个作为“服务器”,另一个作为“客户端”。处理

回答 0 投票 0

如何在本地机器上的不同版本的 Python 脚本之间发送单向消息?

我在 Python 3.10 中有一个第一个发送者脚本,它需要发送一些数据 def post_updates(*args): sender.send_message("optional_key", 参数) 然后是 Python 3.7 中的第二个接收器脚本

回答 3 投票 0

Node.js 多节点通信

我有 7 个 nodejs 实例在 1 台主机上运行,目前它们通过 IPC 相互通信并且工作正常。只是现在每个 nodejs 实例都运行一个单独的服务器。 这是因为我

回答 0 投票 0

如何解决这个简单的单向本地机器消息传递问题

我在 Python 3.10 中有一个第一个发送者脚本,它需要发送一些数据 def post_updates(*args): sender.send_message("optional_key", 参数) 然后是 Python 3.7 中的第二个接收器脚本

回答 3 投票 0

NodeJS 派生的 Python 进程 - Python 的 process.send() 的替代方案?

我正在用 NodeJS 分叉一个 Python 脚本,当分叉时,默认情况下,NodeJS 会在这个新进程和父进程之间创建一个 IPC。 使用 NodeJS,要将消息从孩子发送到父母,我会处理...

回答 2 投票 0

Windows 命名管道 ReadFile 失败并出现错误 232

我有两个 32 位应用程序通过 Windows 中的命名管道进行通信而没有错误。 最近由于项目需要,我不得不将其中一个 32 位应用程序转换为 64 位应用程序,现在...

回答 1 投票 0

Android IPC Binder - onTransact() 等待前一个返回

我有一个使用 IPC 的应用程序。 我的主应用程序正在接收来自远程服务的单向回调。 收到这些回调后,我正在做一些及时的工作(1-20 秒)。 如果我明白

回答 0 投票 0

操作系统学校项目

我需要帮助使用 C 和系统调用在 Ubuntu 中完成我的 schhol 项目。 该项目的目的是模拟船舶在港口之间运输不同种类货物的交通

回答 0 投票 0

亲子沟通问题

父母有“m”条消息要发送给“n”个孩子。在每次迭代中,它向所有子节点发送一条消息。如果所有回复“已收到”,它会发送下一条消息。下面是我的代码 #包括 父母有“m”条消息要发送给“n”个孩子。在每次迭代中,它向所有子节点发送一条消息。如果所有回复“已收到”,它会发送下一条消息。下面是我的代码 #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <sys/wait.h> #include <stdio.h> #include <string.h> #include <signal.h> #include <stdlib.h> #include <unistd.h> #define MAX_LEN 50 struct details { int no; int id; char msg_text[MAX_LEN]; }; typedef struct msg_buf { long int msg_type; struct details d; } msg; char message[20][50] = { " ", "Message1", "Message2", "Message3", "Message4", "Message5", "Message6", "Message7", "Message8" }; int main(int argc, char *argv[]) { int id1, id2, n, m, i, j, status, p_id; pid_t pid; msg snd, rcvd; if (argc < 2) { perror("Too few arguments"); return -1; } n = atoi(argv[1]); m = atoi(argv[2]); id1 = msgget((key_t)78, IPC_CREAT | 0666); id2 = msgget((key_t)56, IPC_CREAT | 0666); if (id1 == -1 || id2 == -1) { printf("Error in creating message queue\n"); return -1; } p_id = getpid(); printf("\nQueues are created.\n\n"); for (i = 1; i <= n; i++) { pid = fork(); if (pid == 0) break; } if (pid == 0) { for (j = 1; j <= m; j++) { printf("Process %d waiting for message %d\n", getpid(), j); while (msgrcv(id1, &rcvd, sizeof(struct details), j + 1, IPC_NOWAIT) < 0) { } srand(time(0)); strcpy(snd.d.msg_text, "Received"); snd.msg_type = rcvd.msg_type; snd.d.no = rcvd.d.no; snd.d.id = getpid(); if (msgsnd(id2, &snd, sizeof(struct details), IPC_NOWAIT) < 0) { perror("msgsnd"); } else { printf("Reply sending successful for message %d for process %d\n", snd.d.no, snd.d.id); } } } if (p_id == getpid()) { for (j = 1; j <= m; j++) { strcpy(snd.d.msg_text, message[j]); snd.msg_type = j + 1; snd.d.no = j; if (msgsnd(id1, &snd, sizeof(struct details), 0) < 0) { perror("msgsnd"); } else { printf("Message %d sent- \t\t\t\t%s\n", j, snd.d.msg_text); } for (i = 1; i <= n; i++) { sleep(i); if (msgrcv(id2, &rcvd, sizeof(struct details), j + 1, 0) >= 0) { printf("Reply received from child %d for message %d - \t%s\n", rcvd.d.id, j, rcvd.d.msg_text); } } } wait(NULL); printf("Communication End.\n\n"); } } 我得到的输出是n=2,m=2是: Queues are created. Message 1 sent- Message1 Process 14804 waiting for message 1 Process 14805 waiting for message 1 Reply sending successful for message 1 for process 14804 Process 14804 waiting for message 2 Reply received from child 14804 for message 1 - Received 此后什么也没有打印。没有任何进展。问题是什么?如何解决这个问题? 最大的单一问题是在评论中提到的一个: AFAICS,您每次迭代发送一条消息,因此最多一个孩子可以阅读它。您不会向每个孩子发送一条消息。 任何给定的消息都可以被(最多)一个进程接收。对于 n 进程接收消息,您必须发送 n 消息。 其他问题主要是装饰性的。我使用了 GitHub 上我的 SOQ(堆栈溢出问题)存储库中可用的日志记录代码作为文件 stderr.c 和 stderr.h 在 src/libsoq 子目录中。一些消息被写入 stdout — 没有只接受文件流的函数,所以我使用 err_logmsg() 接受文件流、控制选项和退出状态(但函数不应该退出,所以这是未使用的)以及格式和参数。 结果是: /* SO 7592-2454 */ #include <errno.h> #include <signal.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/ipc.h> #include <sys/msg.h> #include <sys/wait.h> #include <unistd.h> #include "stderr.h" #define MAX_LEN 50 struct details { int no; int id; char msg_text[MAX_LEN]; }; typedef struct msg_buf { long int msg_type; struct details d; } msg; static char message[20][50] = { " ", "Message1", "Message2", "Message3", "Message4", "Message5", "Message6", "Message7", "Message8" }; static const char usestr[] = "num_kids num_msgs"; static void dump_message(const char *tag, const msg *info) { err_logmsg(stdout, err_getlogopts(), 0, "%s: type %ld (details: no %d, id %d, text [%s])\n", tag, info->msg_type, info->d.no, info->d.id, info->d.msg_text); } int main(int argc, char *argv[]) { err_setarg0(argv[0]); if (argc != 3) err_usage(usestr); int n = atoi(argv[1]); int m = atoi(argv[2]); int id1 = msgget((key_t)78, IPC_CREAT | 0666); int id2 = msgget((key_t)56, IPC_CREAT | 0666); if (id1 == -1 || id2 == -1) err_syserr("failed to create a message queue: "); pid_t p_id = getpid(); err_setlogopts(ERR_PID|ERR_MILLI); err_logmsg(stdout, err_getlogopts(), 0, "Queues are created.\n"); pid_t pid; for (int i = 1; i <= n; i++) { pid = fork(); if (pid == 0) break; } msg snd; msg rcvd; if (pid == 0) { for (int j = 1; j <= m; j++) { err_logmsg(stdout, err_getlogopts(), 0, "Waiting for message %d\n", j); while (msgrcv(id1, &rcvd, sizeof(struct details), j + 1, IPC_NOWAIT) < 0) err_syserr("msgrcv() returned with error status: "); dump_message("Message received", &rcvd); strcpy(snd.d.msg_text, "Received"); snd.msg_type = rcvd.msg_type; snd.d.no = rcvd.d.no; snd.d.id = getpid(); if (msgsnd(id2, &snd, sizeof(struct details), IPC_NOWAIT) < 0) err_sysrem("msgsnd() failed: "); else dump_message("Message sent", &snd); } err_logmsg(stdout, err_getlogopts(), 0, "Child process complete\n"); exit(EXIT_SUCCESS); } if (p_id == getpid()) { for (int j = 1; j <= m; j++) { strcpy(snd.d.msg_text, message[j]); snd.msg_type = j + 1; snd.d.no = j; for (int i = 0; i < n; i++) { if (msgsnd(id1, &snd, sizeof(struct details), 0) < 0) err_sysrem("msgsnd() failed: "); else dump_message("Message sent", &snd); } for (int i = 1; i <= n; i++) { err_logmsg(stdout, err_getlogopts(), 0, "Dozing for %d seconds\n", i); sleep(i); if (msgrcv(id2, &rcvd, sizeof(struct details), j + 1, 0) >= 0) dump_message("Reply received", &rcvd); else err_syserr("msgrcv() failed: "); } } int corpse; int status; while ((corpse = wait(&status)) > 0) err_remark("Child %d exited with status 0x%.4X\n", corpse, status); err_logmsg(stdout, err_getlogopts(), 0, "Communication End.\n\n"); } return 0; } 有大量的日志记录,因为我需要看看发生了什么。代码应该验证 n 和 m 的值(它们应该至少是 1 并且不超过一些微弱的理智数字(例如 10,但会有一个或两个值(枚举或定义常数)来限制可接受的范围。 这是一个示例输出(源代码msg79.c,程序msg79): $ ./msg79 2 3 msg79: 2023-04-03 21:36:38.215 - pid=67247: Queues are created. msg79: 2023-04-03 21:36:38.217 - pid=67247: Message sent: type 2 (details: no 1, id 1, text [Message1]) msg79: 2023-04-03 21:36:38.217 - pid=67247: Message sent: type 2 (details: no 1, id 1, text [Message1]) msg79: 2023-04-03 21:36:38.217 - pid=67247: Dozing for 1 seconds msg79: 2023-04-03 21:36:38.217 - pid=67248: Waiting for message 1 msg79: 2023-04-03 21:36:38.217 - pid=67249: Waiting for message 1 msg79: 2023-04-03 21:36:38.217 - pid=67248: Message received: type 2 (details: no 1, id 1, text [Message1]) msg79: 2023-04-03 21:36:38.217 - pid=67249: Message received: type 2 (details: no 1, id 1, text [Message1]) msg79: 2023-04-03 21:36:38.217 - pid=67248: Message sent: type 2 (details: no 1, id 67248, text [Received]) msg79: 2023-04-03 21:36:38.217 - pid=67248: Waiting for message 2 msg79: 2023-04-03 21:36:38.217 - pid=67249: Message sent: type 2 (details: no 1, id 67249, text [Received]) msg79: 2023-04-03 21:36:38.218 - pid=67248: Message received: type 3 (details: no 2, id 1, text [Message2]) msg79: 2023-04-03 21:36:38.218 - pid=67249: Waiting for message 2 msg79: 2023-04-03 21:36:38.218 - pid=67249: Message received: type 3 (details: no 2, id 1, text [Message2]) msg79: 2023-04-03 21:36:38.218 - pid=67248: Message sent: type 3 (details: no 2, id 67248, text [Received]) msg79: 2023-04-03 21:36:38.218 - pid=67249: Message sent: type 3 (details: no 2, id 67249, text [Received]) msg79: 2023-04-03 21:36:38.218 - pid=67248: Waiting for message 3 msg79: 2023-04-03 21:36:38.219 - pid=67249: Waiting for message 3 msg79: 2023-04-03 21:36:38.219 - pid=67248: Message received: type 4 (details: no 3, id 1, text [Message3]) msg79: 2023-04-03 21:36:38.219 - pid=67249: Message received: type 4 (details: no 3, id 1, text [Message3]) msg79: 2023-04-03 21:36:38.219 - pid=67248: Message sent: type 4 (details: no 3, id 67248, text [Received]) msg79: 2023-04-03 21:36:38.219 - pid=67249: Message sent: type 4 (details: no 3, id 67249, text [Received]) msg79: 2023-04-03 21:36:38.219 - pid=67248: Child process complete msg79: 2023-04-03 21:36:38.219 - pid=67249: Child process complete msg79: 2023-04-03 21:36:39.219 - pid=67247: Reply received: type 2 (details: no 1, id 67248, text [Received]) msg79: 2023-04-03 21:36:39.219 - pid=67247: Dozing for 2 seconds msg79: 2023-04-03 21:36:41.220 - pid=67247: Reply received: type 2 (details: no 1, id 67249, text [Received]) msg79: 2023-04-03 21:36:41.220 - pid=67247: Message sent: type 3 (details: no 2, id 1, text [Message2]) msg79: 2023-04-03 21:36:41.220 - pid=67247: Message sent: type 3 (details: no 2, id 1, text [Message2]) msg79: 2023-04-03 21:36:41.220 - pid=67247: Dozing for 1 seconds msg79: 2023-04-03 21:36:42.221 - pid=67247: Reply received: type 3 (details: no 2, id 67248, text [Received]) msg79: 2023-04-03 21:36:42.221 - pid=67247: Dozing for 2 seconds msg79: 2023-04-03 21:36:44.223 - pid=67247: Reply received: type 3 (details: no 2, id 67249, text [Received]) msg79: 2023-04-03 21:36:44.223 - pid=67247: Message sent: type 4 (details: no 3, id 1, text [Message3]) msg79: 2023-04-03 21:36:44.223 - pid=67247: Message sent: type 4 (details: no 3, id 1, text [Message3]) msg79: 2023-04-03 21:36:44.223 - pid=67247: Dozing for 1 seconds msg79: 2023-04-03 21:36:45.227 - pid=67247: Reply received: type 4 (details: no 3, id 67248, text [Received]) msg79: 2023-04-03 21:36:45.227 - pid=67247: Dozing for 2 seconds msg79: 2023-04-03 21:36:47.227 - pid=67247: Reply received: type 4 (details: no 3, id 67249, text [Received]) msg79: 2023-04-03 21:36:47.227 - pid=67247: Child 67249 exited with status 0x0000 msg79: 2023-04-03 21:36:47.227 - pid=67247: Child 67248 exited with status 0x0000 msg79: 2023-04-03 21:36:47.228 - pid=67247: Communication End. $

回答 1 投票 0

如何使用消息队列在 C 中的进程之间获得随机暂停?

我正在编写一个使用进程间消息队列的 C 程序。我正在尝试重现进程 J(法官)和 n-child 进程之间的拍卖。程序从输入文件 txt 和 nu...

回答 0 投票 0

回复 webContents.send

我的理解是你不能从渲染进程回复从主进程发送的事件。 当通信从渲染器进程到主进程时,你可以做同样的事情

回答 1 投票 0

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