库函数基于系统调用之上,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.
本文出自 “小止” 博客,请务必保留此出处http://10541556.blog.51cto.com/10531556/1761786
原文:http://10541556.blog.51cto.com/10531556/1761786