gpt4 book ai didi

C - 内部有 fork()/pipe() 的 WHILE 循环

转载 作者:太空宇宙 更新时间:2023-11-03 23:52:21 25 4
gpt4 key购买 nike

我有一个问题,我必须在类里面制作的 shell 中实现一个按键记录器。在创建子进程并运行 execlp() 后,我无法在 while 循环中获取程序流以继续循环。

这是我为处理遇到问题的部分而制作的一个简单程序。我的主程序 pipe.c 包括带有 while 循环的父/子进程,该循环“应该”继续从用户使用 fgets(),创建一个子进程,使用 dup2(),写入标准输出,然后子进程调用 receive.c 可执行文件,该可执行文件将从标准输入获取输入并显示它。

/* file: pipe.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main() {
int key_logger_on = 0;
int p[2];
pid_t pid;
char str[256];
char input[1024];
int status;
char * file = "test.txt";

printf("Input :: ");
while(fgets(input, sizeof(input), stdin)) {

if (pipe(p)==-1) {
perror("Pipe create error");
exit(1);
}

if ((pid=fork())==-1) {
perror("Fork create error");
exit(1);
}

if (pid==0) {
close(p[1]); // Close write
dup2(p[0],0);
close(p[0]);
execlp("receive",file,NULL);
}

else {
close(p[0]); // Close read
fflush(stdout);
dup2(p[1],1);
close(p[1]);
write(1, input, strlen(input)+1);
waitpid(pid, NULL, 0);
}
printf("Input :: ");
}
}

这是获取输入的标准输入并显示它的简单 receive.c。该文件只是传递参数的测试。

/* file: receive.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
char input[256];
fgets(input, sizeof(input), stdin);
printf("FILE: %s RECEIVE: %s", argv[0],input);
return 0;
}

现在,所有这些对我来说都是在第一次运行时,它获取输入,将其发送到标准输出,子调用接收,打印出输入,然后整个父程序退出,while 循环被忽略,一切就此结束。我对 fork 和管道很陌生,所以处理起来非常令人沮丧!甚至让我第一次在这里发帖提问!非常感谢你提前。

最佳答案

今天做的是我的重复任务。检查此代码。我也用你的接收测试了它:

#define PREAD 0
#define PWRITE 1

/*
*
*/

int main(int argc, char** argv) {

int key_logger_on = 0;
int pIn[2];
int pOut[2];
pid_t pid;
char str[256];
char input[1024] = "";
int status;

char file[] = "test.txt";
char buf;
printf("Input :: ");
while (fgets(input,sizeof(input),stdin)) {

char nChar;
int nResult;

if (pipe(pIn) < 0) {
perror("allocating pipe for child input redirect");
return -1;
}
if (pipe(pOut) < 0) {
close(pIn[PREAD]);
close(pIn[PWRITE]);
perror("allocating pipe for child output redirect");
return -1;
}

pid = fork();
if ( pid==0) {
// child continues here

// redirect stdin
if (dup2(pIn[PREAD], 0) == -1) {
perror("stdin");
return -1;
}

// redirect stdout
if (dup2(pOut[PWRITE], 1) == -1) {
perror("stdout");
return -1;
}

// redirect stderr
if (dup2(pOut[PWRITE], 2) == -1) {
perror("stderr");
return -1;
}

// all these are for use by parent only
close(pIn[PREAD]);
close(pIn[PWRITE]);
close(pOut[PREAD]);
close(pOut[PWRITE]);

// run child process image
nResult = execl("receive",file,NULL);

exit(nResult);
} else if (pid > 0) {
// parent continues here

// close unused file descriptors, these are for child only
close(pIn[PREAD]);
close(pOut[PWRITE]);

write(pIn[PWRITE], input, strlen(input));

// char by char reading
while (read(pOut[PREAD], &nChar, 1) == 1) {
write(STDOUT_FILENO, &nChar, 1);
}

// close we done
close(pIn[PWRITE]);
close(pOut[PREAD]);
}
printf("Input :: ");
}
}

关于C - 内部有 fork()/pipe() 的 WHILE 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16497055/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com