Рубрики

Факториальный расчет с использованием fork () в C для Linux

Напишите программу на Unix C, используя системный вызов fork (), который генерирует факториал и дает последовательность рядов, таких как 1, 2, 6, 24, 120… в дочернем процессе.
Номер последовательности указывается в командной строке.
Примеры:

Input :gfg@ubuntu:~/$ gcc -o fork fork.c
       gfg@ubuntu:~/$ ./fork 6

Output :1 
        1  2 
        1  2  6 
        1  2  6  24 
        1  2  6  24  120 
        1  2  6  24  120  720 
        After deletion sum
        1  3  9  33  153  873 Done

Input :gfg@ubuntu:~/$ gcc -o fork fork.c
       gfg@ubuntu:~/$ ./fork -2

Output :negative number entered -2

Для создания дочернего процесса используется fork (). fork () возвращает:

  • <0 не удалось создать дочерний (новый) процесс
  • = 0 для дочернего процесса
  • > 0 т.е. идентификатор процесса дочернего процесса к родительскому процессу. Когда> 0 родительский процесс будет выполняться.

Внутри дочернего процесса: если input равен 6, первые шесть чисел факториальной последовательности будут даны как выходные данные дочернего процесса. Поскольку родительский и дочерний процессы имеют свои собственные копии данных, дочернему процессу необходимо будет вывести последовательность.
Внутри родительского процесса . Родитель вызывает функцию wait (), чтобы дождаться завершения дочернего процесса перед выходом из программы. Выполните необходимую проверку ошибок, чтобы убедиться, что неотрицательное число не передается в командной строке.

// C программа для иллюстрации факторного расчета
// используя fork () в C для Linux
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <string.h>
#include <stdlib.h>

  

int main(int argc , char *argv[] )

{

    pid_t pid;

  

    if (argc != 2)

    {

        printf("arg missing or exceeding\n");

        exit(0);

    }

  

    // atoi преобразует строку в целое число

    if ( atoi ( argv[1] ) <0 )

    {

        printf("negative number entered %d", atoi(argv[1]));

        exit(0);

    }

  

    pid=fork();

  

    if ( pid<0 )

    {

        printf("failed to create child\n");

        exit(0);

    }

  

    else if ( pid==0 )

    {

        // Дочерний процесс

        int ans = 0, i, j, k = 2, n;

  

        // atoi преобразует строку в целое число

        n = atoi(argv[1]);

        int arr[n],sum[n];

  

        arr[0] = 1;

  

        // генерация факториала

        for (i=1 ; i<n; i++)

        {

            arr[i] = arr[i-1]*k;

            k++;

        }

  

        // печать и сумма каждой подсерии

        for (j=0; j<n; j++)

        {

            sum[j] = 0;

            for (i=0; i<=j; i++)

            {

                printf(" %d ",arr[i]);

                sum[j]+=arr[i];

            }

            printf("\n");

        }

  

        for (i=0; i<n; i++)

        {

            if ((sum[i]%2) == 0)

                sum[i] = -1;

        }

  

        printf("After deletion sum\n");

        for (i=0; i<n; i++)

        {

            if (sum[i] > 0)

                printf(" %d ", sum[i]);

        }

        exit(0);

    }

  

    // родительский процесс

    else

    {

        wait(NULL);

  

        // ожидание завершения дочернего процесса

        printf("Done\n");

    }

}

Код скомпилированного кода сохранен с именем fork.c

gfg@ubuntu:~/$ gcc -o fork fork.c

Входные данные:

gfg@ubuntu:~/$ ./fork 5

Выход:

 1 
 1  2 
 1  2  6 
 1  2  6  24 
 1  2  6  24  120 
After deletion sum
 1  3  9  33  153 Done

Во-первых, аргумент командной строки принимается. Затем количество аргументов передается и проверяется, является ли аргумент положительным.
После этого сгенерируйте факториальный ряд.
Связанная статья- C программа для демонстрации fork () и pipe ()

Ссылки:

Эта статья предоставлена Kartik Ahuja . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Факториальный расчет с использованием fork () в C для Linux

0.00 (0%) 0 votes