库函数基于系统调用之上,eg:printf(库函数)和write(系统调用)。经过重定向后,fwrite的内容在文件打印了两次,因为:1.缓冲区方式发生变更(由行缓冲变为全缓冲)2.库函数自带缓冲区,系统调用无缓冲区。
write原型:ssize_t write(int fd, const void *buf, size_t count);#include
#include
#include
#include
#include
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.