从 parent 进程中的 .txt 中读取数字并使用管道将其发送到 child 进程并写入
Read numbers from .txt in parent process and send it to child process with pipe and write it
我正在尝试将双数从 parent 发送到 child,但它只打印第一个然后停止。
这是我的代码:
#include <sys/stat.h>
#include <sys/unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <signal.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <time.h>
#include <math.h>
int main()
{
pid_t pid;
int pip[2];
int fd, n;
double x1;
double x2;
pipe(pip);
pid = fork();
fd = open("numbers.txt", O_RDONLY);
if(pid == 0)
{
close(pip[1]);
read(pip[0], &x2, sizeof(double));
printf("%lf\n", x2);
close(pip[0]);
}
else
{
close(pip[0]);
n = read(fd, &x1, sizeof(double));
while(n)
{
write(pip[1], &x1, sizeof(double));
}
close(pip[1]);
waitpid(pid, NULL, 0);
}
return 0;
}
当我尝试读取或写入时我正在关闭管道,另一个问题是它打印 0.000000 而不是数字的实际值。
it prints only the first and then stops.
注意 child(尝试)只读 一个 浮动之前离开,所以即使你只发送了几个,第一个是 print
正在做
n = read(fd, &x1, sizeof(double));
假设 numbers.txt 包含双精度的二进制表示,但由于扩展名 txt 我认为它们包含数字它们的 ASCII 形式而不是二进制形式。还要注意循环 while n is not null 与 EOF 上的 read return -1 (not 0)
如果我修改你的程序以从它们的 ascii 形式读取它们,并在 child 中添加一个循环,一切正常
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/wait.h>
int main()
{
pid_t pid;
int pip[2];
FILE * fd;
double x1;
double x2;
pipe(pip);
pid = fork();
fd = fopen("numbers.txt", "r");
if(pid == 0)
{
close(pip[1]);
while (read(pip[0], &x2, sizeof(double)) == sizeof(double))
printf("%f\n", x2);
close(pip[0]);
}
else
{
close(pip[0]);
while (fscanf(fd, "%lf", &x1) == 1)
{
write(pip[1], &x1, sizeof(double));
}
close(pip[1]);
waitpid(pid, NULL, 0);
}
return 0;
}
编译执行:
/tmp % gcc -Wall p.c
/tmp % cat numbers.txt
1.2
3.14
/tmp % ./a.out
1.200000
3.140000
/tmp %
我正在尝试将双数从 parent 发送到 child,但它只打印第一个然后停止。
这是我的代码:
#include <sys/stat.h>
#include <sys/unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <signal.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <time.h>
#include <math.h>
int main()
{
pid_t pid;
int pip[2];
int fd, n;
double x1;
double x2;
pipe(pip);
pid = fork();
fd = open("numbers.txt", O_RDONLY);
if(pid == 0)
{
close(pip[1]);
read(pip[0], &x2, sizeof(double));
printf("%lf\n", x2);
close(pip[0]);
}
else
{
close(pip[0]);
n = read(fd, &x1, sizeof(double));
while(n)
{
write(pip[1], &x1, sizeof(double));
}
close(pip[1]);
waitpid(pid, NULL, 0);
}
return 0;
}
当我尝试读取或写入时我正在关闭管道,另一个问题是它打印 0.000000 而不是数字的实际值。
it prints only the first and then stops.
注意 child(尝试)只读 一个 浮动之前离开,所以即使你只发送了几个,第一个是 print
正在做
n = read(fd, &x1, sizeof(double));
假设 numbers.txt 包含双精度的二进制表示,但由于扩展名 txt 我认为它们包含数字它们的 ASCII 形式而不是二进制形式。还要注意循环 while n is not null 与 EOF 上的 read return -1 (not 0)
如果我修改你的程序以从它们的 ascii 形式读取它们,并在 child 中添加一个循环,一切正常
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/wait.h>
int main()
{
pid_t pid;
int pip[2];
FILE * fd;
double x1;
double x2;
pipe(pip);
pid = fork();
fd = fopen("numbers.txt", "r");
if(pid == 0)
{
close(pip[1]);
while (read(pip[0], &x2, sizeof(double)) == sizeof(double))
printf("%f\n", x2);
close(pip[0]);
}
else
{
close(pip[0]);
while (fscanf(fd, "%lf", &x1) == 1)
{
write(pip[1], &x1, sizeof(double));
}
close(pip[1]);
waitpid(pid, NULL, 0);
}
return 0;
}
编译执行:
/tmp % gcc -Wall p.c
/tmp % cat numbers.txt
1.2
3.14
/tmp % ./a.out
1.200000
3.140000
/tmp %