Balan Sinniah wrote:

> I am learning parallel processing and I am doing a parallel program using
> fork(). My problem is as stated below...

[snip]

> Can anyone guide me???

Try the attached program.

-- 
Glynn Clements <[EMAIL PROTECTED]>


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

#define PROCESSES 5
#define CHILDREN (PROCESSES - 1)

void do_sort(void)
{
        int result;

        if (fscanf(stdin, "%d", &result) != 1)
        {
                fprintf(stderr, "No input\n");
                exit(1);
        }

        for (;;)
        {
                int n, hi;

                if (fscanf(stdin, "%d", &n) != 1)
                        break;

                if (n < result)
                {
                        hi = result;
                        result = n;
                }
                else
                        hi = n;

                fprintf(stdout, "%d\n", hi);
                fflush(stdout);
        }

        fprintf(stderr, "%d\n", result);

        fclose(stdout);
}

int main(void)
{
        pid_t pids[CHILDREN];
        int i;

        for (i = 0; i < CHILDREN; i++)
        {
                pid_t pid;
                int fds[2];

                if (pipe(fds) < 0)
                {
                        perror("pipe");
                        exit(1);
                }

                pid = fork();
                if (pid < 0)
                {
                        perror("fork");
                        exit(1);
                }

                if (pid == 0)
                {
                        if (dup2(fds[0], STDIN_FILENO) < 0)
                        {
                                perror("dup2(in)");
                                exit(1);
                        }

                        if (close(fds[0]) < 0)
                        {
                                perror("close(in)");
                                exit(1);
                        }

                        if (close(fds[1]) < 0)
                        {
                                perror("close(out)");
                                exit(1);
                        }

                        do_sort();
                        exit(0);
                }
                else
                {
                        if (dup2(fds[1], STDOUT_FILENO) < 0)
                        {
                                perror("dup2(out)");
                                exit(1);
                        }

                        if (close(fds[0]) < 0)
                        {
                                perror("close(in)");
                                exit(1);
                        }

                        if (close(fds[1]) < 0)
                        {
                                perror("close(out)");
                                exit(1);
                        }

                        pids[i] = pid;
                }
        }

        do_sort();

        for (i = 0; i < CHILDREN; i++)
        {
                if (wait(NULL) < 0)
                {
                        perror("wait");
                        exit(1);
                }
        }

        return 0;
}

Reply via email to