[英]What is happing to the parent process?
这里的任务是:这是基本的C程序,必须包含两个进程。第一个程序在文件中写入60个随机数。需要写入的秒数必须读取文件并将偶数仅写入另一个新文件中。我有这段代码和需要将偶数写到文件中的父进程,它无法正常工作。我的问题也与代码的结构有关,这是描述进程的最佳方法。
#include <stdio.h>
#include <fcntl.h>
int main() {
int pid, fd, buf, i, fd2, buf2;
pid = fork();
switch (pid) {
case 0: {
printf("\n Child process is writing numbers. \n");
fd = open("file.dat", O_RDWR | O_CREAT, 0644);
for (i = 0; i < 60; i++) {
buf = rand() % 20 - 10;
printf("\n Writing number %d %d ", i + 1, buf);
write(fd, &buf, sizeof(buf));
}
close(fd);
break;
}
case -1: {
printf("\n Fork error! \n");
}
default: {
wait(pid);
printf("\n Parent process is Copying numbers. \n");
fd = open("file.dat", O_RDONLY);
fd2 = open("file_output.dat", O_RDWR | O_CREAT, 0644);
while (read(fd, &buf, sizeof(buf)) == sizeof(buf)) {
if (buf & ~1)
(buf2 = buf);
write(fd2, &buf2, sizeof(buf2));
printf("Writing number in file_output.dat %d \n", buf2);
}
close(fd2);
close(fd);
}
}
return 0;
}
您的条件是错误的:
if (buf &~ 1) (buf2=buf);
write(fd2, &buf2, sizeof(buf2));
您不管写出数字,但是如果是奇数(除了需要修复偶数/奇数测试),那么就不会更新buf2
。 如果第一个数字为奇数,则buf2
未初始化。
你需要这个:
if (buf % 2 != 0) continue;
write(fd2, &buf, sizeof(buf));
printf("Writing number in file_output.dat %d \n", buf);
请注意,这可能无法正确测试负偶数。 您可以测试abs(buf) % 2 != 0
。 唯一可能无法处理的数字是INT_MIN
。
您对偶数的测试是错误的。 您排除了位1,因此将选择大于1的任何数字。 您有效地测试
if (buf & 0xfffffffe) ...
但是,您应该测试一下
if (!(buf & 1)) ...
甚至
if ((buf % 2) == 0) ...
好的,代码中有几个错误。
看起来您想要实现此目标:子级写入随机数,父级等待子级终止,读取随机数,仅将偶数写入第二个文件。
但是,您使用了wait(),这是使用错误的函数。 而是像这样使用waitpid():
waitpid(pid, NULL, 0);
另一个错误是在代码中只写偶数的错误。 我会这样写:
if (!(buf & 1))
write(fd2, &buf1, sizeof(buf1));
这样,您根本不需要buf2。 实际上,在您当前的代码中,如果数字不是偶数,它将仍然在文件中写入数字! 它将仅写入它再次读取的最后一个偶数。
为什么在使用便携式fopen / fread / fwrite时为什么使用非便携式的open / read / write? 这对我来说毫无意义。
让我们假设您的sizeof int ==4。假设您的第一个进程写入4个字节,无论出于何种原因,您的第二个进程将其读取为2个字节的两个块,因此read在您的循环中返回2: while (read(fd, &buf, sizeof(buf)) == sizeof(buf))
是2 == sizeof(buf)吗? 不。也许您的循环在错误的条件下终止...
fread用两个参数解决了这个问题:一个用于项目的大小,另一个用于所需的项目数。 for (size_t x = fread(&buf, sizeof buf, 1, file_ptr); x > 0; x = fread(&buf, sizeof buf, 1, file_ptr)) { /* ... */ }
...“一旦成功完成时,只有在遇到读取错误或文件结尾时,fread()才返回成功读取的元素数,该元素数少于nitems。” 该保证不存在以供阅读。 您可能需要使用x来确定要写入多少个项目,因为这可以告诉您读取了多少个项目。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.