gpt4 book ai didi

c - 两个进程读取相同的标准输入

转载 作者:太空宇宙 更新时间:2023-11-04 03:54:27 25 4
gpt4 key购买 nike

在 C 程序中,我有一个菜单,其中有一些选项可供选择,用字符表示。有一个选项可以 fork 进程并运行一个函数(我们可以说它在后台运行)。这个在后台运行的函数,在某些情况下,可以要求用户输入数据。

我的问题是:当主进程请求数据(或选项)并且子进程也请求数据时,我无法正确发送数据。

你知道如何处理这个问题吗?

我将添加一些代码结构(我不能全部发布,因为大约有 600 行代码):

int main(int argc, char *argv[])
{
// Some initialization here
while(1)
{
scanf("\n%c", &opt);

switch(opt)
{
// Some options here
case 'r':
send_command(PM_RUN, fiforfd, fifowfd, pid);
break;
// Some more options here
}
}
}

void send_command(unsigned char command, int fiforfd, int fifowfd, int pid)
{
// Some operations here
if(command == PM_RUN)
{
time = microtime();
childpid = fork();
if(childpid == -1)
{
// Error here
}
else if(childpid == 0)
{
// Here is the child
// Some operations and conditions here
// In some condition, appears this (expected a short in hexadecimal)
for(i = 0; i < 7; ++i)
scanf("%hx\n",&data[i]));
// More operations
exit(0);
}
}
}

最佳答案

它不起作用,但它可以作为解决方案的开始

void    send_command(int *p)
{
pid_t pid;

pid = fork(); // check -1
if (pid == 0)
{
int i = 0;
int h;
int ret;
char buffer[128] = {0};

dup2(p[0], 0);
while (i < 2)
{
if ((ret = scanf("%s\n", buffer)))
{
//get your value from the buffer
i++;
}
}
printf("done\n");
exit(1);
}
}

在子进程中,您将从输入中读取所有内容,然后在其中找到您需要的值。

int     main()
{
char opt;
int p[2];

pipe(p);
while(1)
{
scanf("\n%c", &opt);


write(p[1], &opt, 1);
write(p[1], "\n", 1);

switch(opt)
{
// Some options here
case 'r':
{
send_command(p);
break;
}
default:
break;
// Some more options here
}
}
}

在当前情况下,您读取的每个字符都将写入读取 p[0] 的子进程。

当然,如果你有很多子进程,你必须有一个文件描述符列表并写入每个子进程(并为每个子进程调用管道)。

祝你好运

编辑:也许你应该看看 namedpipe,父进程在其中写入所有内容,所有子进程都在其中读取

关于c - 两个进程读取相同的标准输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17880157/

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