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()
(尤其是忽略其返回值时)。