prime sieve

prime sieve program for xv6 using pipes
mail@pastecode.io avatarunknown
c_cpp
a month ago
1.0 kB
1
Indexable
Never
#include "kernel/types.h"
#include "user/user.h"

void gen(int p[2])
{
    close(p[0]);
    for (int i = 2; i <= 35; i++)
    {
        if (write(p[1], &i, sizeof(int)) < 0)
            exit(1);
    }

    close(p[1]);
    exit(0);
}

void solve(int *left)
{
    int prime;
    int ret = read(*left, &prime, 4);

    if (ret == 0)
        exit(0);

    if (ret > 0)
        fprintf(1, "prime %d\n", prime);

    int p[2];
    pipe(p);

    if (fork() == 0)
    {
        close(p[1]);
        solve(p);
        close(p[0]);
        exit(0);
    }

    close(p[0]);

    int num;
    while (read(*left, &num, 4) > 0)
    {
        if (num % prime)
        {
            write(p[1], &num, 4);
        }
    }
    close(p[1]);
    wait(0);
}

int main()
{
    int p[2];
    pipe(p);

    if (fork() == 0)
        gen(p);

    close(p[1]);
    wait(0);

    if (fork() == 0)
        solve(p);

    close(p[0]);

    wait(0);
    exit(0);
}