Хранить данные в дочерней программе C - PullRequest
0 голосов
/ 13 апреля 2019

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

Я хочу вернуть результат после прочтения всего текста, тогда родитель будет отображать результат следующим образом: За такой текст "AaaaA" я получаю:

  • «а» отображается 3 раза

  • 'A' отображается 2 раза

Чтобы выполнить мою задачу, которую я использовал для и 2 канала, вот пример моего кода:


// I'll skip the code for variable and file input because i have a specific question.
.......
 // basic code

if( pid_child == 0){

 // child code

    close(pipe_1[1]);
    close(pipe_2[0]);

    read(pipe_1[0], &caract, sizeof(char));

}else {
   // parent area
    while((c = fgetc(file)) != EOF){
        if((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')){

             close(pipe_1[0]);
             close(pipe_2[1]);

             write(pipe_1[1], &c, sizeof(char));
        } 
    }
 }

Я знаю, что когда вы fork() родительский процесс, вы создаете копию этого процесса, и я хочу знать, как мне сохранить весь результат в дочернем процессе, тогда я бы прочитал их или вызвал их в конце чтения мой файл?

Например, я хочу создать двумерный динамический массив, который может содержать все символы, если первое измерение и число вхождений во втором измерении.

Для предыдущего примера я бы

int **array; array = malloc(2 * sizeof(int *));

и это даст мне:

A 2

3

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

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

Спасибо

1 Ответ

0 голосов
/ 13 апреля 2019
if( pid_child == 0){

 // child code

    close(pipe_1[1]);
    close(pipe_2[0]);
    fd_set inputfd;
    FD_ZERO(inputfd);  // zero out fd set
    FD_SET(pipe_1[0], &inputfd);  // add input pipe to set
    int state = select(pipe_1[0] + 1, &inputfd, NULL, NULL, NULL); // wait until input arrives
    if( FD_ISSET(pipe_1[0], &inputfd) )
    { read(pipe_1[0], &caract, sizeof(char)); }
    // process it and send it back
}else {
   // parent area
    // you could also do a select before sending the data - for stdin - see link 
    while((c = fgetc(file)) != EOF){
        if((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')){

             close(pipe_1[0]);
             close(pipe_2[1]);

             write(pipe_1[1], &c, sizeof(char));
        } 
    }
    // do a select here as well and wait for input to come from the user
    fd_set child_input;
    FD_ZERO(child_input);
    FD_SET(pipe_1[1], &child_input);   // i'm assuming pipe_1[1] is input pipe
    select(pipe_1[1] + 1, &child_input, NULL, NULL, NULL);
    if( FD_ISSET(pipe_1[1], &child_input) )
          // child has sent back data, process it
 }

- выберите пример: https://beej.us/guide/bgnet/html/multi/advanced.html#select

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