一、文件重定向
[root@localhost pipe]# echo "hello world" hello world //没有进行重定向,在终端显示 [root@localhost pipe]# echo "hello world" > txt //进行重定向,不在终端显示 [root@localhost pipe]# cat txt //查看生成的文件 txt 的内容 hello world [root@localhost pipe]#
DUP(2) Linux Programmer’s Manual DUP(2) NAME dup, dup2 - duplicate a file descriptor //复制文件描述符 SYNOPSIS #include <unistd.h> int dup(int oldfd); //要被替代掉的文件描述符, 旧文件描述符 int dup2(int oldfd, //要被替代掉的文件描述符, 旧文件描述符 int newfd); //替代的文件描述符, 新文件描述符
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <fcntl.h> int main(int argc,char* argv[]) { int fd; fd=open(argv[1], O_RDWR|O_CREAT, 0666); if(-1 == fd ) { perror("open"); exit(1); } fd=dup2(fd,1); //将 fd 指向了 stdout , 即将 stdout 重定向到了 fd 描述的文件 if(-1 == fd) { perror("dup2"); exit(1); } write(1,"abc\n",sizeof("abc\n")); printf("this statement can not write to stdout.\n"); close(fd); return 0; }
程序的执行过程如下:
[root@localhost redirectory]# ll 总计 12 -rwxr-xr-x 1 root root 5436 12-12 14:18 a.out -rw-r--r-- 1 root root 468 12-12 14:18 main.c [root@localhost redirectory]# ./a.out txt //可以看到 printf函数没有输出,而通过 write(1,xx,xx) 的信息也没有输出到stdout [root@localhost redirectory]# cat txt //数据写入到了txt, 查看txt 的内容 abc [root@localhost redirectory]#
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <fcntl.h> int main(int argc,char* argv[]) { int fd; fd=open(argv[1], O_RDWR|O_CREAT, 0666); if(-1 == fd ) { perror("open"); exit(1); } #if 0 fd=dup2(fd,1); if(-1 == fd) { perror("dup2"); exit(1); } #endif write(1,"abcdefg\n",sizeof("abcdefg\n")); printf("this statement can write to stdout.\n"); close(fd); return 0; }
[root@localhost redirectory]# vim main.c [root@localhost redirectory]# gcc main.c [root@localhost redirectory]# cat txt abc [root@localhost redirectory]# ./a.out txt abcdefg //write(1,xx,xx) 正常从标准输出输出 this statement can write to stdout. //printf 也正常输出到标准输出 [root@localhost redirectory]# cat txt abc [root@localhost redirectory]#
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <fcntl.h> int main(int argc,char* argv[]) { int fd; fd=dup(1); printf("the new fd is: %d\n",fd); write(fd,"abcdefg\n",sizeof("abcdefg\n")); close(fd); return 0; }
[root@localhost redirectory]# vim dup.c [root@localhost redirectory]# gcc dup.c [root@localhost redirectory]# ./a.out the new fd is: 3 //默认dup()成功返回最小的未分配的文件描述符 abcdefg //通过fd, 实现了对 stdout = 1 标准输出的写操作 [root@localhost redirectory]#
#include <stdio.h> int main(void) { printf("\033#8"); return 0; }
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
[root@localhost vt100]# EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
[root@localhost vt100]# echo -ne "\033#8"
#include <stdio.h> int main(void) { for(;;) { printf("\033[H"); printf("0123456789abcdefghijklmnopqrstuvwxyz"); } return 0; }
#include <stdio.h> int main(void) { int i; for(i=0;i<3;i++) { printf("\033[37m\033[40m"); printf("0123456789abcdefghijklmnopqrstuvwxyz\n"); printf("\033[30m\033[47m"); printf("0123456789abcdefghijklmnopqrstuvwxyz\n"); } return 0; }
TIME(2) Linux Programmer’s Manual TIME(2) NAME time - get time in seconds //获取从1970年1月1日0时0分0秒 到 当前时刻的 总秒数 SYNOPSIS #include <time.h> time_t time(time_t *t); //输出参数,存储获取的秒
#include <stdio.h> #include <time.h> int main(void) { time_t t; printf("From 1970 01-01 0:00:00 have past secnods:%ld\n", time(&t)); return 0; }
[root@localhost time]# ./a.out From 1970 01-01 0:00:00 have past secnods:1386835671
CTIME(3) Linux Programmer’s Manual CTIME(3) NAME asctime, ctime, gmtime, localtime, mktime, asctime_r, ctime_r, gmtime_r, local- time_r - transform date and time to broken-down time or ASCII SYNOPSIS #include <time.h> char *asctime(const struct tm *tm); char *asctime_r(const struct tm *tm, char *buf); char *ctime(const time_t *timep); char *ctime_r(const time_t *timep, char *buf); struct tm *gmtime(const time_t *timep); struct tm *gmtime_r(const time_t *timep, struct tm *result); struct tm *localtime(const time_t *timep); struct tm *localtime_r(const time_t *timep, struct tm *result); time_t mktime(struct tm *tm);
struct tm { int tm_sec; /* seconds */ //秒 int tm_min; /* minutes */ //分 int tm_hour; /* hours */ //时 int tm_mday; /* day of the month */ //一个月的第几天, 即 日 int tm_mon; /* month */ //月 int tm_year; /* year */ //年, 从1900年到现在的年数 int tm_wday; /* day of the week */ //星期几 int tm_yday; /* day in the year */ //一年中的第几天 int tm_isdst; /* daylight saving time */ };
#include <stdio.h> #include <time.h> #include <stdlib.h> int main(void) { time_t t; struct tm tm; void* p_tmp; char buf[32]; time(&t); p_tmp=localtime_r(&t,&tm); if(NULL == p_tmp) { perror("get local time"); exit(1); } sprintf(buf,"%d-%d-%d %d %d-%d-%d", 1900 + tm.tm_year, 1+ tm.tm_mon,tm.tm_mday, tm.tm_wday, tm.tm_hour,tm.tm_min,tm.tm_sec); printf("%s\n",buf); return 0; }
[root@localhost time]# ./a.out 2013-12-12 4 16-30-4 //2013年11月12日 星期4 16:30:04
STRFTIME(3) Linux Programmer’s Manual STRFTIME(3) NAME strftime - format date and time SYNOPSIS #include <time.h> size_t strftime(char *s, //存储格式化后的字符串 size_t max, //字符串的最大长度 const char *format, //格式化字符串 const struct tm *tm); //struct time 的结构体指针
#include <stdio.h> #include <time.h> #include <stdlib.h> int main(void) { time_t t; struct tm tm; void* p_tmp; char buf[64]; //clear screen printf("\033[2J"); for(;;) { time(&t); p_tmp=localtime_r(&t,&tm); if(NULL == p_tmp) { perror("get local time"); exit(1); } strftime(buf,64,"%Y-%m-%d %A %T %z",&tm); printf("\033[H\033[34m"); printf("%s\n",buf); sleep(1); } return 0; }
[root@localhost input]# ls
event0 event1 event2 event3 event4 js0 mice mouse0 mouse1 mouse2
[root@localhost input]#