库函数基于系统调用之上,eg:printf(库函数)和write(系统调用)。经过重定向后,fwrite的内容在文件打印了两次,因为:1.缓冲区方式发生变更(由行缓冲变为全缓冲)2.库函数自带缓冲区,系统调用无缓冲区。
write原型:ssize_t write(int fd, const void *buf, size_t count);
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<sys/types.h> int main() { pid_t id; printf("hello world"); const char* msg="I love you"; write(1,msg,strlen(msg)); id=fork(); if(id<0) { perror("fork"); exit(1); } else if(id==0) { printf("pid: %d,ppid: %d",getpid(),getppid()); } else { printf("pid: %d,ppid: %d",getpid(),getppid()); } return 0; }
将输出结果重定向到file文件
//修改上述代码为: int main() { pid_t id; printf("hello world"); const char* msg="I love you"; close(1); FILE* fp=fopen("file","w+"); write(1,msg,strlen(msg)); id=fork(); ... }
关闭文件描述符:标准输出,下一个文件描述符会从前面空的小整数下标开始往后,此时file占据文件描述符1.