4标准IO及IO流分离

[TOC]

标准IO

与系统函数相比

  • 优点
    • 可移植性更强
    • 效率更高
  • 缺点
    • 不容易进行双向通信
    • 有时可能频繁调用fflush函数
    • 需要以FILE结构体指针的形式返回fd

fd--->FILE结构体指针
include <stdio.h>
FILE* fdopen(int fd, const char* mode);

  • fd需要转换的fd
  • mode将要创建的FILE结构体指针的模式信息
    • 常见的'r','w'

FILE* ---> fd
include <stdio.h>
int fileno(FILE* stream);

IO分离

读写分离

fd的复制与半关闭

直接close()无法关闭的原因: FILE

复制fd

#include <unistd.h>
......

6多线程服务器端

[TOC]

线程的创建与运行

#include <pthread.h>
int pthread_create(
pthread_t* restrict thread, const pthread_attr_t* restrict attr,
void * (* start_routine)(void *), void* restrict arg
);

  • thread保存新创建线程ID的变量地址值
  • attr用于传递线程属性的参数。传递NULL时,创建默认属性的线程
  • start_routine相当于线程main函数的、在单独执行流中执行的函数地址值(函数指针)
  • arg通过第三个参数传递调用函数时的 包含传递参数信息的变量 的地址
  • 成功0,失败返回其他值

int pthread_join(pthread_t thread, void** status);

  • thread该ID的线程终止后,此函数才会返回
  • status保存线程的main函数返回值的指针变量地址值

线程同步

线程安全的函数

指函数在被多个线程同时调用也不会引发问题

......

1计网基础拾遗

知识点

字节流服务和数据报服务的区别

这种区别对应到实际编程中,则体现为通信双方是否必须执行相同次数的读、写操作(当然,这只是表现形式)。当发送端应用程序连续执行多次写操作时,TCP模块先将这些数据放入TCP发送缓冲区中。当TCP模块真正开始发送数据时,发送缓冲区中这些等待发送的数据可能被封装成一个或多个TCP报文段发出。因此,TCP模块发送出的TCP报文段的个数和应用程序执行的写操作次数之间没有固定的数量关系。

当接收端收到一个或多个TCP报文段后,TCP模块将它们携带的应用程序数据按照TCP报文段的序号(见后文)依次放入TCP接收缓冲区中,并通知应用程序读取数据。接收端应用程序可以一次性将TCP接收缓冲区中的数据全部读出,也可以分多次读取,这取决于用户指定的应用程序读缓冲区的大小。因此,应用程序执行的读操作次数和TCP模块接收到的TCP报文段个数之间也没有固定的数量关系。

......
关于我
zinkt
zinkt@foxmail.com
前端基于bootstrap5
后端使用Spring Boot
基于它们构建的一个个人博客系统