库函数基于系统调用之上,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;
}

Linux下系统调用与库函数_调用

将输出结果重定向到file文件

Linux下系统调用与库函数_系统_02

//修改上述代码为:
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();
       ...
}

Linux下系统调用与库函数_系统_03

关闭文件描述符:标准输出,下一个文件描述符会从前面空的小整数下标开始往后,此时file占据文件描述符1.