C 这个写入管道的程序可以优化性能吗?

C 这个写入管道的程序可以优化性能吗?,c,C,我制作了一个示例程序作为模型,它需要计算比现在这样的示例乘法更复杂的任务。我被告知,我制作的这个示例程序可以优化以获得更好的性能。有什么可以改进的吗?也许不止一根管子 当前,该程序将执行第二个进程,父进程将变量写入管道,子进程读取变量并进行计算,写入同一管道,当子进程完成执行时,父进程最终读取管道 #include<stdlib.h> #include<stdio.h> #include<unistd.h> #include <sys/types.h&g

我制作了一个示例程序作为模型,它需要计算比现在这样的示例乘法更复杂的任务。我被告知,我制作的这个示例程序可以优化以获得更好的性能。有什么可以改进的吗?也许不止一根管子

当前,该程序将执行第二个进程,父进程将变量写入管道,子进程读取变量并进行计算,写入同一管道,当子进程完成执行时,父进程最终读取管道

#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int multi(int var) {
   int status;
   int multi;
   int pfd[2];
   if ( pipe(pfd) < 0 ) {
           perror("pipe");
       exit(EXIT_FAILURE);
   }
   int pid = fork();
   if (pid < 0) {
       printf("fork error\n");
       exit(0);
   }
   if (pid>0) {
       write(pfd[1], &var, sizeof(var));
       wait(&status);
       read(pfd[0], &multi, sizeof(multi));
       close(pfd[0]);
   } else {
       read(pfd[0], &var, sizeof(var));
       multi = 10 * var;
       write(pfd[1], &multi, sizeof(multi));
       close(pfd[1]);
       int pidchild = getpid();
       kill(pidchild, 9);
   }
   return multi;
}

int main(void) {
   int x;
   fscanf(stdin, "%d", &x);
   printf("%d\n", multi(x));
   return 0;
}
#包括
#包括
#包括
#包括
#包括
int multi(int var){
智力状态;
int-multi;
int-pfd[2];
如果(管道(pfd)<0){
佩罗(“管道”);
退出(退出失败);
}
int-pid=fork();
if(pid<0){
printf(“fork错误\n”);
出口(0);
}
如果(pid>0){
写入(pfd[1],&var,sizeof(var));
等待(&状态);
读取(pfd[0],&multi,sizeof(multi));
关闭(pfd[0]);
}否则{
读取(pfd[0],&var,sizeof(var));
多重=10*var;
写入(pfd[1],&multi,sizeof(multi));
关闭(pfd[1]);
int-pidchild=getpid();
杀戮(pidchild,9岁);
}
返回多个;
}
内部主(空){
int x;
fscanf(标准输入、%d、&x);
printf(“%d\n”,多(x));
返回0;
}

为什么孩子会自杀?它可以退出,你知道。。。此外,在
wait
ing之前,父级应该
read
,这样就不会重复输出。当我删除kill时,程序将打印两次相同的输出。管道应被视为单向连接-否则,在控制管道上的写入程序是否读取它刚刚写入的内容时会遇到问题。如果您需要传递给孩子和来自孩子的信息,那么最好使用两个管道,一个用于家长与孩子之间的通信,另一个用于孩子与家长之间的通信。注意关闭父级和子级中足够多的文件描述符。在两个方向上使用相同的管道进行通信是有问题的。由于两个进程的管道两端都是开放的,如果另一个进程意外结束,则可能会导致一个进程中的
read
无限阻塞。如果
write
read
数据块较大,则代码必须能够处理单个调用
read
write
处理的字节数小于预期的情况。检查所有函数的返回值并处理错误或返回值指示的任何内容。您需要
fork()
还是可以使用线程?此外,即使您使用fork,是否真的需要通过管道发送
var
?子进程在
fork()
时间获取所有内容的副本。在父级中,如果您正在执行阻塞
read()
,则无需调用
wait()
(尤其是忽略其返回值时)。