ps -ax | tee -a processes.txt 在 UNIX C 编程环境中,意味着不通过 shell 脚本。 基本上有一个 API,这样我就可以在 STDIN 和-6ren">
gpt4 book ai didi

c - "tee"类似UNIX中的编程api

转载 作者:太空宇宙 更新时间:2023-11-04 04:06:10 27 4
gpt4 key购买 nike

我想要这样的东西

$> ps -ax | tee -a processes.txt

在 UNIX C 编程环境中,意味着不通过 shell 脚本。

基本上有一个 API,这样我就可以在 STDIN 和/或 STDOUT 上开球,这样我就可以自动将 CLI 上出现的任何内容记录到一个文件中。想象一下,有一个前台进程与用户交互并响应终端的一些输出。我想将终端中显示的所有内容也保存在文件中以供以后检查。

我会想象像这样神奇的东西:

tee(STDIN, "append", logFile);

谢谢!

跟进,这是我根据Lars写的程序(见下面的回答部分),但不是我想要的:

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

int pfd[2];
if (pipe(pfd) == -1) { perror("pipe"); }


if (fork()==0) { // child reads from pipe
close(pfd[1]);

mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
int ufd = open("user_study.log", O_CREAT | O_APPEND | O_WRONLY, mode);
if (ufd == -1) {
perror("Cannot open output file"); exit(1);
} // ++

char buf;
while (read(pfd[0], &buf, 1) > 0) {
write(STDOUT_FILENO, &buf, 1); // write to stdout
write(ufd, &buf,1); // and to log
}

close(pfd[0]);

} else { // parent write to pipe
// dup STDOUT to the pipe
close(pfd[0]);
dup2(pfd[1], STDOUT_FILENO);

char msg[200];
msg[0] = "";
do {
scanf("%s", msg);
printf("program response..");

} while (strcmp(msg, "exit")!=0);

close(pfd[1]);

}

return 1;
}

实际运行:

[feih@machine ~/mytest]$ ./a.out
abc
haha
exit
program response.. <---- the output is delayed by the chld process, not desired
program response..
program response..

[feih@machine ~/mytest]$ less user_study.log
program response.. <---- the log doesn't contain input
program response..
program response..

所需的运行和日志(模拟):

[feih@machine ~/mytest]$ ./a.out
abc
program response..
haha
program response..
exit
program response..


[feih@machine ~/mytest]$ less user_study.log
abc
program response.. <--- the log should be the same as the running
haha
program response..
exit
program response..

所以到目前为止,这个问题还没有完全解决。

最佳答案

你可以这样做:

  • 创建管道(参见pipe(2))
  • fork
  • 在 child 中,从管道读取并写入每个输出
    • stdout 和一个文件,或者你需要的任何东西
  • 在父级中,将 stdout 重定向到管道(参见 dup2(2))

您需要处理很多棘手问题,但这是可行的。

如果没有额外的过程,你不能这样做,因为 printf 只写入一个文件描述符(stdout 那个)。

关于c - "tee"类似UNIX中的编程api,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5637801/

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