Linux中的系统IO函数

一. 系统IO函数
        1>. 一些概念
            文件描述符
            PCB
            C库函的IO缓冲区

        1) 文件描述符
             int 类型
             一个进程最多可打开多少文件: 
        2) pcb
             进程控制块
              在其中有一个文件描述符表 -- 数组[1024]


C库IO函数工作流程:
    

 pcb和文件描述符:

虚拟地址空间就是程序启动起来之后从硬盘上会有一块虚拟内存分配出来。

cpu 为什么要使用虚拟地址空间与物理地址空间映射?解决了什么样的问题?

1.方便编译器和操作系统安排程序的地址分布。
        程序可以使用一系列相邻的虚拟地址来访问物理内存中不相邻的大内存缓冲区。通过虚拟地址空间与物理地址空间映射解决不连续的缓冲区的问题。
2.方便进程之间隔离
        不同进程使用的虚拟地址彼此隔离。一个进程中的代码无法更改正在由另一进程使用的物理内存。 
3.方便OS使用你那可怜的内存。
        程序可以使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区。当物理内存的供应量变小时,
        内存管理器会将物理内存页(通常大小为 4 KB)保存到磁盘文件。数据或代码页会根据需要在物理内存与磁盘之间移动。

 虚拟地址空间的布局如下:

0-3G是用户空间        3-4G是内核空间

用户区, 内核区
        
        代码段
        已经初始化的全局变量
        未被初始化的全局变量
        堆 -- 从下往上
        共享库
        栈 - 从上往下
        环境变量
        内核区     

C库函数与系统函数的关系 :

         FD:文件描述符        FP_POS:文件指针    BUFFER:缓冲区

         write对0-3G的用户空间进行操作        sys_write()对3-4G的内核空间进行操作

 2>. open

可以去man文档里进行查看,命令,即表示查看man文档的第二章的open函数


                打开方式:
                    必选项:
                        O_RDONLY
                        O_WRONLY
                        O_RDWR
                    可选项:
                        O_CREAT
                            文件权限: 本地有一个掩码
                                    文件的实际权限:
                                    给定的权限
                                    本地掩码(取反)
                                &
                                    实际的文件权限
                                    777
                                    111111111
                                    111111101
                                    111111101
                                    775
                                    
                        O_TRUNC
                        O_EXCL
                        O_APPEND

open函数中的errno:


        3>. read
                返回值:
                    1. -1 读文件失败
                    2. 0 文件读完了
                    3. >0 读取的字节数
        4>. write
                返回值:
        5>. lseek
                返回值:
        6>. close
                返回值:
                
               

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用标准IO函数来实现图片本地下载。以下是一个示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/socket.h> #include <netdb.h> #include <arpa/inet.h> #define MAXLINE 1024 int main(int argc, char **argv) { if (argc != 2) { fprintf(stderr, "usage: %s <url>\n", argv[0]); exit(1); } char *url = argv[1]; char *filename = strrchr(url, '/') + 1; char *hostname = url + strlen("http://"); int sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("socket error"); exit(1); } struct hostent *he = gethostbyname(hostname); if (he == NULL) { perror("gethostbyname error"); exit(1); } struct sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(80); server_addr.sin_addr = *((struct in_addr *)he->h_addr); if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { perror("connect error"); exit(1); } char request[MAXLINE]; snprintf(request, MAXLINE, "GET /%s HTTP/1.1\r\nHost: %s\r\n\r\n", filename, hostname); if (write(sockfd, request, strlen(request)) < 0) { perror("write error"); exit(1); } char response[MAXLINE]; int nread; while ((nread = read(sockfd, response, MAXLINE)) > 0) { if (strstr(response, "\r\n\r\n") != NULL) { break; } } char *image_data = strstr(response, "\r\n\r\n") + 4; int image_size = nread - (image_data - response); int fd = open(filename, O_CREAT | O_WRONLY, 0644); if (fd < 0) { perror("open error"); exit(1); } if (write(fd, image_data, image_size) < 0) { perror("write error"); exit(1); } close(sockfd); close(fd); return 0; } ``` 这个程序使用 `socket` 函数创建一个 TCP 套接字,使用 `gethostbyname` 函数获取主机名对应的 IP 地址,使用 `connect` 函数连接到主机的 HTTP 端口,构造 HTTP 请求报文,使用 `write` 函数向主机发送请求报文,使用 `read` 函数从主机接收响应报文,从响应报文提取图片数据,使用标准IO函数将图片数据写入本地文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值