// https://www.man7.org/linux/man-pages/man2/dup.2.html
#include
// 给 oldfd 分配一个新的描述符,返回
int dup(int oldfd);
// 给 oldfd 分配一个新的描述符 newfd,如果 newfd 已经打开,则先关闭
// 原来只有 oldfd 一个指针,现在有2个指针执行那个句柄对应的文件啦
int dup2(int oldfd, int newfd);
#include
#include
#include
#include
#include
int mOldStdout = -1;
int mNewStdout = -1;
// stdout 输出 到文件中
void dupOutput(char * filename)
{
mNewStdout = open(filename, O_CREAT|O_WRONLY|O_APPEND|O_SYNC, S_IRWXU|S_IRWXG|S_IROTH);
mOldStdout = dup(STDOUT_FILENO);
fsync(STDOUT_FILENO);
dup2(mNewStdout, STDOUT_FILENO); // STDOUT_FILENO 指向 mNewStdout 文件,stdout 输出就会写到文件里
}
// 还原 stdout 到 命令窗口
void restoreOutput()
{
fsync(STDOUT_FILENO);
dup2(mOldStdout, STDOUT_FILENO);
close(mOldStdout);
close(mNewStdout);
}
int main(int argc, char * argv[]) {
printf("IN STDOUT-1\n");
dupOutput("logfile");
printf("IN LOGFILE-1\n");
restoreOutput();
printf("IN STDOUT-2\n");
}
#include
#include
#include
#include
#include
static FILE *logHandel = NULL;
int src_stdout = -1; // 一般 stdout 的 handel 是 1. stderr 是 2
int src_stderr = -1; // 一般 stdout 的 handel 是 1. stderr 是 2
void dupOutput(int fd)
{
src_stdout = dup(STDOUT_FILENO); // 保持老的 handle,用于恢复
src_stderr = dup(STDERR_FILENO);
fsync(STDOUT_FILENO);
fsync(STDERR_FILENO);
dup2(fd, STDOUT_FILENO); // 把 STDOUT_FILENO 指向 fd 句柄
dup2(fd, STDERR_FILENO);
}
void restoreOutput(int fd)
{
fsync(STDOUT_FILENO);
fsync(STDERR_FILENO);
dup2(src_stdout, STDOUT_FILENO); // STDOUT_FILENO 指向原来的 handle
dup2(src_stderr, STDERR_FILENO);
close(src_stdout);
close(src_stderr);
}
int log_set_path(const char *path)
{
if (access(path, F_OK | W_OK) == 0) {
logHandel = fopen(path, "a+");
}
if (!logHandel) {
printf("open log file(%s) error: %s\n", path, strerror(errno));
return errno;
}
dupOutput(fileno(logHandel));
return 0;
}
FILE *freopen(char *filename, char *type, FILE *stream);
freopen 类似于 fopen+dup2, 同时包含打开和重定向功能
#include
int main()
{
int a,b;
freopen("D:\\in.txt","r",stdin); //输入重定向,输入数据将从D盘根目录下的in.txt文件中读取
freopen("D:\\out.txt","w",stdout); //输出重定向,输出数据将保存在D盘根目录下的out.txt文件中
while(scanf("%d %d",&a,&b)!=EOF)
printf("%d\n",a+b);
fclose(stdin);//关闭重定向输入
fclose(stdout);//关闭重定向输出
return 0;
}
#include
#include
int main()
{
int a,b;
freopen("D:\\in.txt","r",stdin); //输入重定向,输入数据将从D盘根目录下的in.txt文件中读取
freopen("D:\\out.txt","w",stdout); //输出重定向,输出数据将保存在D盘根目录下的out.txt文件中
while(cin>>a>>b)
cout<
这里主要是重定向符号的使用
新建文件 >
追加文件 >>
nohup java -jar app.jar >log 2>&1 &
简写 nohup java -jar app.jar &>log &