如何解决使用管道更改 C
我有一个操作系统问题,我需要在子进程中执行“cat”命令。子进程是使用 fork() 系统调用创建的。在终端中运行 'cat' 命令时,应读取在终端中输入的输入并将其转换为另一个字符串。示例:终端中输入的“dog”应转换为“fish”。程序应该使用 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",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] = '\0'; // string ends with '\0'
*/
write(fd2[1],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] = '\0'; // string ends with '\0'
read(fd2[0],concat_str,strlen(concat_str)+1);
printf("%s",concat_str);
close(fd2[0]);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。