Используйте каналы для изменения входных данных, введенных с помощью команды cat в дочернем процессе в C

#c #operating-system #pipe #fork #cat

Вопрос:

У меня проблема с операционной системой, когда мне нужно выполнить команду » cat » в дочернем процессе. Дочерний процесс создается с помощью системного вызова fork (). Во время выполнения команды » cat » в терминале входные данные, введенные в терминале, должны быть прочитаны и преобразованы в другую строку. Пример: «собака», введенная в терминале, должна быть преобразована в «рыба». Программа должна использовать системный вызов pipe() для считывания входных и выходных данных преобразованной строки. Пример вывода после выполнения команды «cat»:

 dog
fish
dog
fish
 

Мой текущий вывод после выполнения команды «cat»:

 dog
dog
hh
hh
 

Я включил свой код C, но он не считывает ввод команды «cat».

 #include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<string.h>
#include<sys/wait.h>

void main(int argc , char *argv[]){
    int fd[2];
    int fd2[2];
    char fixed_str[] = "forgeeks.org";
    pid_t childpid;

    if (pipe(fd)==-1)
    {
        fprintf(stderr, "Pipe Failed" );
        return 1;
    }
    if (pipe(fd2)==-1)
    {
        fprintf(stderr, "Pipe Failed" );
        return 1;
    }
    childpid = fork();

    printf("before if");
    if (childpid < 0){
        fprintf(stderr, "fork Failed" );
        return 1;

    } else if(childpid == 0){
        char input_str[100];

        printf("child");
        /*
        close(fd[1]);
        dup2(fd[0], STDIN_FILENO);

        char* myargs[] = {"cat",NULL};
        execvp(myargs[0], myargs);
        printf("cat executed");
      //  scanf("%s", input_str);
        read(fd[0], input_str, 100);
        close(fd[0]);
*/
        close(fd2[0]);
        dup2(STDOUT_FILENO, fd2[1]);
        char* myargs[] = {"cat",NULL};
        execvp(myargs[0], myargs);

        /*
        int k = strlen(input_str);
        int i;
        for (i=0; i<strlen(fixed_str); i  )
            input_str[k  ] = fixed_str[i];

        input_str[k] = '';   // string ends with ''
        */

        write(fd2[1], input_str, strlen(input_str) 1);
        close(fd2[1]);

    } else {

        printf("parent");
        char concat_str[100];

        close(fd2[1]);
        dup2(STDIN_FILENO, fd2[0]);
        wait(NULL);
        printf("after wait");
        int l = strlen(concat_str);
        int m;
        for (m=0; m<strlen(fixed_str); m  )
            concat_str[l  ] = fixed_str[m];

        concat_str[l] = '';   // string ends with ''
        read(fd2[0], concat_str, strlen(concat_str) 1);
        printf("%s",concat_str);
        close(fd2[0]);
    }
}
 

Комментарии:

1. Вашему примеру трудно следовать. Не могли бы вы переписать свой пример более понятным способом (т. Е. Не используйте «cat» как для команды, так и для ввода, приведите четкий пример, показывающий нам поведение, которое вы хотите от каждого процесса)?

2. Вы должны различать «командную строку» и «терминал». Многое из того, что вы пишете, на самом деле не имеет никакого смысла.

3. строки, введенные в командной строке, доступны в argv массиве. Входные данные, записанные на терминал, будут доступны для чтения из stdin.

4. Вы прокомментировали правильные dup2 буквы s. Котельная плита dup2(fd[0], STDIN_FILENO); close(fd[0]); close(fd[1]); (закройте fd после того, как вы ее отключите, и неиспользуемый конец трубы.)