c - C 如何在进程之间共享信息?
问题描述
我需要一些 C 代码的帮助。基本上我有n
执行一些代码的进程。一旦它们几乎完成,我希望“管理器进程”(这是主要功能)向每个n
进程发送一个int
变量,每个进程可能不同。我的想法是signal(handler_function, SIGALRM)
一旦所有流程开始。当过程几乎完成时,它使用kill(getpid(), SIGSTOP)
以等待Manager Process
. SIM_TIME
几秒钟后,handler_function
发送int
变量Message Queue
然后使用kill(process_pid, SIGCONT)
以唤醒等待进程。那些进程在被唤醒后应该int
从 接收该变量Message Queue
,打印它并简单地终止,让Manager Process
再次控制。
这是一些代码:
/**
* Child Process creation using fork() system call
* Parent Process allocates and initializes necessary variables in shared memory
* Child Process executes Student Process code defined in childProcess function
*/
pid_t runChild(int index, int (*func)(int index))
{
pid_t pid;
pid = fork();
if (pid == -1)
{
printf(RED "Fork ERROR!\n" RESET);
exit(EXIT_FAILURE);
}
else if (pid == 0)
{
int res = func(index);
return getpid();
}
else
{
/*INSIGNIFICANT CODE*/
currentStudent = createStudent(pid);
currentStudent->status = FREE;
students[index] = *currentStudent;
currentGroup = createGroup(index);
addMember(currentStudent, currentGroup);
currentGroup->closed = FALSE;
groups[index] = *currentGroup;
return pid;
}
}
每个进程执行的代码
/**
* Student Process Code
* Each Student executes this code
*/
int childProcess(int index)
{
/*NOTICE: showing only relevant part of code*/
printf("Process Index %d has almost done, waiting for manager!\n", index);
/* PROGRAM GETS STUCK HERE!*/
kill(getpid(), SIGSTOP);
/* mex variable is already defines, it's a struct implementing Message Queue message struct*/
receiveMessage(mexId, mex, getpid());
printf(GREEN "Student %d has received variable %d\n" RESET, getpid(), mex->variable);
}
处理函数:
* Handler function
* Will be launched when SIM_TIME is reached
*/
void end_handler(int sig)
{
if (sig == SIGALRM)
{
usleep(150000);
printf(RED "Time's UP!\n" RESET);
printGroups();
for(int i = 0; i < POP_SIZE; i++){
mex->mtype = childPids[i];
mex->variable = generateInt(18, 30);
sendMessage(mexId, mex);
//childPids is an array containing PIDs of all previously launched processes
kill(childPids[i], SIGCONT);
}
}
我希望我的代码是可以理解的。不过我有一个问题,使用提供的代码,整个程序会卡在kill(getpid(), SIGSTOP)
系统调用中。我还尝试ps
在终端中启动,但未检测到活动进程。我认为由于某种原因handler_function
不发送系统调用。kill(childPids[i], SIGCONT)
知道如何解决这个问题吗?谢谢
解决方案
您可能想先阅读 mq_overview 的手册页(man mq_overview)。它在进程之间提供了一种可移植且灵活的通信机制,允许同步和异步机制进行通信。
在您的方法中,存在“一个进程如何知道另一个进程是否在等待”的普遍问题。如果进程没有自行停止,SIGCONT 将被忽略,当它随后挂起自己时,没有人会继续它。
相比之下,两者之间基于消息的通信可以被视为一种小语言。对于简单的交换(例如您的),可以很容易地手动检查语法的完整性。对于更复杂的情况,可以构建状态机甚至嵌套状态机来分析它们的行为。
推荐阅读
- javascript - bootstrap 4 崩溃在一半停止然后打开时无法顺利运行
- python - 使用函数从列表中的文本创建字典
- macos - 如何在 Mac High Sierra 上运行 VPN 自动化程序
- html - 在 xslt 之后保留 HTML 标签
- ubuntu - Unable to install Plotly in Rstudio server
- r - 有序数据的列联表
- javascript - 在 node.js 中刮取所选项目
- ocaml - 为什么我可以添加任意数量的 ; 在 OCaml 顶级行的最后?
- ios - iOS - Tesseract - 无法读取多维数据集语言模型 Cube ERROR (CubeRecoContext::Create): 无法初始化 CubeRecoContext 对象
- node.js - 在 React 中设置 PayPal 客户端单笔支付