gpt4 book ai didi

parent 与 child 之间的沟通

转载 作者:行者123 更新时间:2023-12-04 06:52:49 25 4
gpt4 key购买 nike

我必须编写一个简单的 C 应用程序来创建一个进程和一个子进程 (fork()),并且我必须执行一个操作。父级初始化值,子级计算。我这样写:

#include <stdlib.h>
#include <signal.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

typedef struct {
int op1;
char op;
int op2;
} Operation;

Operation *varOP;

void finalResult()
{
float result = 0;
if(varOP->op == '+') result = (varOP->op1 + varOP->op2);
if(varOP->op == '-') result = (varOP->op1 - varOP->op2);
if(varOP->op == '*') result = (varOP->op1 * varOP->op2);
if(varOP->op == '+') result = (varOP->op1 / varOP->op2)
printf("%f",result);
}

int main () {
int p;
varOP = (Operation *)malloc(sizeof(Operation));
p = fork();
if(p == 0) // If child
{
signal(SIGUSR1, finalResult );
pause();
}

if(p > 0) // If parent
{
varOP->op = '+';
varOP->op1 = 2;
varOP->op2 = 3;
kill(p, SIGUSR1);
wait(NULL);
}
return 0;
}

但是我的 child 从来没有被叫过。我的代码有问题吗?
谢谢你的帮助!

最佳答案

您的示例代码还有一个更基本的问题:每个进程都有自己的数据空间,因此您通过堆向子进程发送信息的技术将不起作用。一种解决方案是使用 管道 .这仅向您的代码添加了四行:

typedef struct {
int op1;
char op;
int op2;
}Operation;

Operation *varOP;

static int pipe_fds[2]; /* <-- added */

static void finalResult(void)
{
float result = 0;
read(pipe_fds[0], varOP, sizeof(Operation)); /* <-- added */
if(varOP->op == '+') result = (varOP->op1 + varOP->op2);
if(varOP->op == '-') result = (varOP->op1 - varOP->op2);
if(varOP->op == '*') result = (varOP->op1 * varOP->op2);
if(varOP->op == '/') result = (varOP->op1 / varOP->op2); /* <-- typo */

printf("%f\n",result);
}

int main (void)
{
int p;
pipe(pipe_fds); /* <-- added */
varOP = (Operation *)malloc(sizeof(Operation));
p = fork();

if(p == 0) // If child
{
signal(SIGUSR1, finalResult );
pause();
}

if(p > 0) // If parent
{
varOP->op = '+';
varOP->op1 = 2;
varOP->op2 = 3;
write(pipe_fds[1], varOP, sizeof(Operation)); /* <-- added */
kill(p, SIGUSR1);
wait(NULL);
}

return 0;
}

关于 parent 与 child 之间的沟通,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2873697/

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