#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 после того, как вы ее отключите, и неиспользуемый конец трубы.)