родительско-дочерний процесс общения через каналы - PullRequest
0 голосов
/ 05 ноября 2011

Я пытаюсь написать программу на C, которая будет искать в массиве целых чисел другое заданное целое число.Однако для ускорения поиска поиск выполняется параллельно двумя дочерними процессами.Родительский процесс читает число целых чисел, а затем целые числа в массиве.Он также читает целое число для поиска.Затем он создает два дочерних процесса.Первый дочерний процесс ищет первую половину массива, а второй дочерний процесс ищет вторую половину.Если целое число найдено, его индекс в массиве отправляется родителю через канал.Если он не найден, -1 передается родителю через канал.Родитель ожидает завершения обоих дочерних процессов и затем печатает соответствующее сообщение.

Я ознакомился с некоторыми книгами, и это то, что я придумал.Однако есть небольшая проблема ... два дочерних процесса выполняются один за другим, а не параллельно.какие изменения я должен сделать?

#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
#include<sys/ipc.h>
#include <string.h>
void main ()
{
int i,status,num1,num2,num3,num4, fd1[2], fd2[2];
int a[1000];
char b[5],c[5],d[5],e[5];
pid_t pid1,pid2;

printf("\n\n\nEnter how many numbers - ");
scanf("%d",&num1);
//printf("\n\nEnter the %d numbers below -\n",num1);
for (i=0;i<num1;i++)
{
    printf("%d : ",i);
    scanf("%d",&a[i]);
}
printf("\n\nEnter the number to search - ");
scanf("%d",&num2);
pipe(fd1);
pipe(fd2);
pid1=fork();
if (pid1==0)
{

    printf("this is the child 1\n");        
    for (i=0;i<(num1/2);i++)
    {
        if (a[i]==num2) 
        {
            printf("found by process 1\n");
            sprintf(b,"%d",i);
            sprintf(c,"%d",-1);
            write(fd1[1],&b,4); 
            write(fd2[1],&c,4);
            //kill(0,1);
            break;
        }
        printf("%d\n",a[i]);

    }
    _exit ( EXIT_FAILURE ) ;
}
else 
if (pid1>0)
{
    pid2=fork();
    if (pid2==0)
    {
        printf("this is the child 2\n");        
        for (i=(num1/2);i<num1;i++)
        {
            if (a[i]==num2) 
            {
                printf("found by process 2\n");
                sprintf(b,"%d",-1);
                sprintf(c,"%d",i);
                write(fd1[1],&b,4);
                write(fd2[1],&c,4);                             
                //kill(0,1);
                break;
            }

            printf("%d\n",a[i]);

        }
        _exit(EXIT_FAILURE);
    }

}

if (waitpid (pid1, &status, 0)>0 && waitpid (pid2, &status, 0)>0)
{   

    read(fd1[0],d,4);
    read(fd2[0],e,4);
    num3=atoi(d);       
    num4=atoi(e);
    if (num3>0) printf("value of i is %d\n",num3);  
    if (num4>0) printf("value of i is %d\n",num4);
}

}

Ответы [ 2 ]

1 голос
/ 05 ноября 2011

Ваш код в порядке, но помните, что процессорное время выделяется довольно большими кусками.То есть, короткие вычисления часто заканчиваются еще до того, как другой процесс даже получил интервал времени процессора.Вставьте несколько звонков на sleep в свои циклы, и вы увидите параллелизм.

0 голосов
/ 05 ноября 2011

Мы уверены, что ваша система имеет более одного ядра?Если у него только один процессор, процессы все равно будут запускаться один за другим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...