クラスで作成したシェルにキーロガーを実装する必要があるという問題があります。子プロセスが作成され、execlp() が実行された後、while ループ内でプログラムの流れを取得してループを継続するのに問題があります。
これは、私が問題を抱えている部分で作業するために作成した簡単なプログラムです..私のメインプログラム、pipe.cには、ユーザーからの入力を取得し続ける「べき」whileループを持つ親/子プロセスが含まれていますfgets()、子プロセスの作成、dup2() の使用、stdout への書き込み、次に子プロセスが receive.c 実行可能ファイルを呼び出し、stdin から入力を取得して表示します。
/* 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 :: ");
}
}
以下は、入力の stdin を取得して表示する単純な 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 ループが無視され、すべてが単に実行されるだけです。終了します。私はフォークとパイプに非常に慣れていないので、これに対処するのは非常にイライラします! 初めてここに質問を投稿させられました!事前にどうもありがとうございました。