这里的任务是:这是基本的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;
}
答案 0 :(得分:1)
你的情况错了:
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 :(得分:0)
您对偶数的测试是错误的。您排除第1位,因此将选择任何大于1的数字。你有效地测试了
if (buf & 0xfffffffe) ...
但是,您应该测试
if (!(buf & 1)) ...
甚至
if ((buf % 2) == 0) ...
答案 2 :(得分:0)
嗯,代码中有一些错误。
看起来你想实现这个目的:孩子写下随机数,父母等待孩子终止,读取随机数,只将偶数数字写到第二个文件。
但是,您使用了wait(),这是一个错误的函数。而是像这样使用waitpid():
waitpid(pid, NULL, 0);
另一个错误在你的代码中只写偶数。我会这样写:
if (!(buf & 1))
write(fd2, &buf1, sizeof(buf1));
这样,你根本不需要buf2。事实上,在你当前的代码中,如果数字不均匀,它仍会为文件写一个数字!它只会写出它再次读取的最后一个偶数。
答案 3 :(得分:0)
当您使用便携式fopen / fread / fwrite时,为什么使用非便携式打开/读/写?这对我来说毫无意义。
让我们假设你的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来确定要写入的项目数,因为它会告诉您读取了多少项。