Как отправлять информацию между процессами в C с помощью fork - PullRequest
0 голосов
/ 25 мая 2020

Я пытаюсь создать программу, которая вычисляет простые множители числа (например, x) с помощью fork ()

В дочернем процессе я хочу повторить форму 2 до x / 2-1 и увидите, что число ведьмы делит x. Но я не знаю, как сообщить родительскому процессу, что я изменил переменную внутри дочерних порций

И теперь мой вопрос ... как я могу отправить информацию для дочернего процесса родителю?

int main(int argc, char *argv[]){
   int var = 0;
   pid = fork();
   if(pid > 0){
      if(var = 0){
         var++;
      else{do nothing}
else if(pid == 0){
  printf("%d\n", var);           here the program will print 0 but i want it to print 1. How?
}
}
}

}

1 Ответ

1 голос
/ 25 мая 2020

следующий предлагаемый код:

  1. чисто компилирует
  2. выполняет желаемую функциональность
  3. проверяет (и обрабатывает) ошибки
  4. документы, почему каждый заголовок включен
  5. демонстрирует один метод межпроцессного взаимодействия (IP C) (каналы)
  6. демонстрирует хорошее использование горизонтального и вертикального интервалов для удобства чтения и простоты понимания
  7. использует int main( void ), поэтому компилятор не предупреждает о неиспользуемых параметрах.
  8. используются фигурные скобки '{' и '}' в теле кодовых блоков case 0: и default, поэтому в этих кодовых блоках могут быть локальные переменные

и теперь предлагаемый код:

#include <stdio.h>    // printf(), perror()
#include <sys/types.h>// pid_t
#include <unistd.h>   // fork(), pipe(), read()
#include <sys/wait.h> // wait()
#include <stdlib.h>   // exit(), EXIT_SUCCESS, EXIT_FAILURE

enum { READ_FROM, WRITE_TO };

int main( void )  
{
    int status; 

    int fd[2];
    if( pipe( fd ) )
    {
        perror( "pipe failed" );
        exit( EXIT_FAILURE );
    }

    pid_t pid = fork();

    switch( pid )
    {
        case -1:
            perror( "fork failed" );
            exit( EXIT_FAILURE );

        case 0: // child process
        {
            int var = 1;
            ssize_t bytesWritten;
            close( fd[ READ_FROM ] );

            if( ( bytesWritten = write( fd[ WRITE_TO ], &var, sizeof( var ) ) ) != sizeof( int ) )
            {
                perror( "write failed" );
                close( fd[ WRITE_TO ] );
                exit( EXIT_FAILURE );
            }

            close( fd[ WRITE_TO ] );
            exit( EXIT_SUCCESS );
        }

        default: // parent process
        {
            int buffer = 0;
            ssize_t bytesRead;
            close( fd[ WRITE_TO ] );

            if( ( bytesRead = read( fd[ READ_FROM ], &buffer, sizeof( buffer ) ) ) != sizeof( int ) )
            {
                perror( "read failed" );
                close( fd[ READ_FROM ] );
                wait( &status );  // waits for child to exit
                exit( EXIT_FAILURE );
            }

            printf( "%d\n", buffer );       
            close( fd[ READ_FROM ] );
            wait( &status );  // waits for child to exit
            break;
        }
    }
}

Типичный / успешный запуск программы приводит к

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