C 使用预定义消息将标准输出重定向到文件
C redirecting stdout to file with predefined message
我想使用 dup() 和 dup2() 复制当我点击 case 's' 时在 stdout 中打印的消息到 case 'f' 打开的文件。
我不确定 dup 系统调用如何工作以及如何将标准输出复制到文件中。我知道我必须使用 dup 来捕获 stdout 指向的内容,然后使用 dup2 在屏幕和文件之间切换。
这是我的代码:
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#define BUFFER_SIZE 128
#define PERMS 0666
int main(int argc, char *argv[])
{
char outBuffer[BUFFER_SIZE] = "This is a message\n";
int count;
int fd;
char input =0;
int a;
if(argc!=2){
printf("Provide an valid file as an argument\n");
exit(1);
}
if((fd = open(argv[1],O_CREAT|O_WRONLY|O_APPEND,PERMS)) == -1)
{
printf("Could not open file\n");
exit(1);
}
printf("0 to terminate, s to write to stdout, f to write to file\n");
do{
scanf(" %c", &input);
switch(input)
{
case 'f':
case 's':
write(1,outBuffer,strlen(outBuffer));
break;
default:
printf("Invalid Choice\n");
}
}while(input != '0');
close(fd);
return 0;
}
dup
系统调用复制文件描述符,该文件描述符创建第二个句柄供程序写入第一个连接的任何位置。
它不会复制activity在i/o频道上发生的任何事情。如果需要,则必须执行两次(或更多次)写入。
考虑使用 'tee' 程序(管道到子进程),它能够将标准输出发送到文件。
case 'f':
pipe fd2[2] ;
pipe(fd2) ;
if ( fork() > 0 ) {
// Child
dup2(fd[0], 0) ;
close(fd[1]) ;
close(
// create command line for 'tee'
char teecmd[256] ;
sprintf(teecmd, "...", ...) ;
execlp(teecmd) ;
} ;
// Parent
fd = fd[1] ;
close(fd[0]) ;
...
我想使用 dup() 和 dup2() 复制当我点击 case 's' 时在 stdout 中打印的消息到 case 'f' 打开的文件。
我不确定 dup 系统调用如何工作以及如何将标准输出复制到文件中。我知道我必须使用 dup 来捕获 stdout 指向的内容,然后使用 dup2 在屏幕和文件之间切换。
这是我的代码:
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#define BUFFER_SIZE 128
#define PERMS 0666
int main(int argc, char *argv[])
{
char outBuffer[BUFFER_SIZE] = "This is a message\n";
int count;
int fd;
char input =0;
int a;
if(argc!=2){
printf("Provide an valid file as an argument\n");
exit(1);
}
if((fd = open(argv[1],O_CREAT|O_WRONLY|O_APPEND,PERMS)) == -1)
{
printf("Could not open file\n");
exit(1);
}
printf("0 to terminate, s to write to stdout, f to write to file\n");
do{
scanf(" %c", &input);
switch(input)
{
case 'f':
case 's':
write(1,outBuffer,strlen(outBuffer));
break;
default:
printf("Invalid Choice\n");
}
}while(input != '0');
close(fd);
return 0;
}
dup
系统调用复制文件描述符,该文件描述符创建第二个句柄供程序写入第一个连接的任何位置。
它不会复制activity在i/o频道上发生的任何事情。如果需要,则必须执行两次(或更多次)写入。
考虑使用 'tee' 程序(管道到子进程),它能够将标准输出发送到文件。
case 'f':
pipe fd2[2] ;
pipe(fd2) ;
if ( fork() > 0 ) {
// Child
dup2(fd[0], 0) ;
close(fd[1]) ;
close(
// create command line for 'tee'
char teecmd[256] ;
sprintf(teecmd, "...", ...) ;
execlp(teecmd) ;
} ;
// Parent
fd = fd[1] ;
close(fd[0]) ;
...