Проблема программы Unix C с использованием каналов и процессов - PullRequest
0 голосов
/ 30 октября 2010

Вот история:

Напишите программу на C, которая создает дочерний процесс и процесс granchild (дочерний процесс дочернего процесса!). Процесс-отец должен прочитать содержимое файла, имя которого будет использоваться в качестве аргумента при запуске программы. Отец должен отправить текст, прочитанный ребенку, чтобы преобразовать эти символы «а», найденные в «о». Измененный текст отправит дочернего элемента внуку, который (внуку) потребуется подсчитать количество строк и количество символов «o» в тексте и распечатать результат на экране (и, возможно, файл output.txt).

Итак, я создаю файл с некоторыми символами «а» внутри и не могу преобразовать эти символы в «о».

Вопрос в том, какую команду использовать для преобразования символов?

Любая помощь высоко ценится.

Вот что я сделал до сих пор:

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <string.h>
int main() {
int fd_1[2],fd_2[2],pointer,pointer2,pid1,pid2,i,n;
char filename[200];
char buffer[500000];

printf("Input filename:");
fflush(stdout);

fflush(stdin);

scanf("%s", filename);

pointer = open(filename, O_RDONLY);
    if (pointer == -1) {
    printf("file does not exist\n");
    }
pipe(fd_1);
if ( pipe(fd_1) == -1) {
    perror("pipe");
    exit(1);    
    }
pid1=fork();

switch(pid1){
    case -1: {
        perror("fork");
        exit(10);
        break;
    }
    case 0: { //child process 
        pipe(fd_2);
        if ( pipe(fd_2) == -1) {
            perror("pipe");
            exit(1);    
        }   
        pid2=fork();
        switch(pid2) {
            case -1: {
                perror("fork");
                exit(10);
                break;
            }
            case 0: { //grandchild process 
                close (fd_2[1]);
                break;
            }
            default: { //child process 
                close (fd_1[1]);
                dup2(fd_1[0],1);
                pointer2 = open(buffer, O_WRONLY);  
                for (i=0; i< sizeof(buffer)  ; i++)
                if (buffer[i] == 'a' ) {
                    buffer[i] = 'o'; 
                }       
                write(fd_1[1], buffer, sizeof(buffer));
                wait(&pid2);
                break;
            }
        }
    }
    default: {  //parent process 
        close (fd_1[0]);
        dup2(fd_1[1],0);    
        n = read(pointer, buffer, 200);
        write(fd_1[1], buffer, n);
        wait(&pid1);
        break;
    }
}
return 0;
}

1 Ответ

1 голос
/ 31 октября 2010

Если предположить, что ребенок прочитал канал в буфер, то что-то вроде:

for (int i = 0; i < bytes_read; ++i)
{
    if (buffer[i] == 'a')
        buffer[i] = 'o';
}
...