我几乎无法理解管道的手册页,所以我需要帮助理解如何在外部可执行文件中获取管道输入。
我有两个程序: main.o &的 log.o
我写了 main.o 到fork。这是它正在做的事情:
我需要使用子fork for main来管道到 log.o
的STDINlog.o 只需要STDIN&带有时间戳记的日志。
我的代码是由我不记得的各种StackOverflow页面中的一些代码组成的。管道的手册页:
printf("\n> ");
while(fgets(input, MAXINPUTLINE, stdin)){
char buf;
int fd[2], num, status;
if(pipe(fd)){
perror("Pipe broke, dood");
return 111;
}
switch(fork()){
case -1:
perror("Fork is sad fais");
return 111;
case 0: // Child
close(fd[1]); // Close unused write end
while (read(fd[0], &buf, 1) > 0) write(STDOUT_FILENO, &buf, 1);
write(STDOUT_FILENO, "\n", 1);
close(fd[0]);
execlp("./log", "log", "log.txt", 0); // This is where I am confused
_exit(EXIT_FAILURE);
default: // Parent
data=stuff_happens_here();
close(fd[0]); // Close unused read end
write(fd[1], data, strlen(data));
close(fd[1]); // Reader will see EOF
wait(NULL); // Wait for child
}
printf("\n> ");
}
答案 0 :(得分:6)
我可以建议一种更简单的方法。有一个名为popen()
的函数。它与system()
函数非常相似,除了您可以读取或写入子stdin/stdout
之外。
示例:强>
int main(int argc, char* argv[])
{
FILE* fChild = popen("logApp.exe", "wb"); // the logger app is another application
if (NULL == fChild) return -1;
fprintf(fChild, "Hello world!\n");
pclose(fChild);
}
在控制台中输入“ man popen ”以获取完整说明。
答案 1 :(得分:5)
我想这就是你要做的事情:
1.主叉,父通过管道传递给孩子的消息
2.子接收来自管道的消息,将消息重定向到STDIN,执行日志
3.记录来自STDIN的消息,做一些事情。
执行此操作的关键是dup2将文件描述符从管道重定向到STDIN。
这是修改过的简单版本:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
int main(int argc, char *argv[]) {
int fd[2];
char buf[] = "HELLO WORLD!";
if(pipe(fd)){
perror("pipe");
return -1;
}
switch(fork()){
case -1:
perror("fork");
return -1;
case 0:
// child
close(fd[1]);
dup2(fd[0], STDIN_FILENO);
close(fd[0]);
execl("./log", NULL);
default:
// parent
close(fd[0]);
write(fd[1], buf, sizeof(buf));
close(fd[1]);
wait(NULL);
}
printf("END~\n");
return 0;
}
答案 2 :(得分:0)