繁体   English   中英

对父进程有什么要求?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM