一、什么是系统编程?
系统编程就是利用系统调用system call进行编程
二、系统编程特点?
1.无法跨平台(OS)
2.速度慢,用户空间到内核空间的切换需要时间
3.更加底层,接口更复杂
三、Linux编程
1.标准库函数与系统调用
①fopen(3)
fopen(2)打开指定的文件,返回一个文件描述符(就是一个int类型的编号 ),分配一个FILE结构体,其中包含该文件的描述符,I/O缓冲区和当前读写位置等信息,返回这个FILE结构体的地址。
②fgetc(3)
通过传入的FILE *参数找到该文件的描述符、I/O缓冲区和当前的读写位置,判断能否从I/O缓冲区中读到下一个字符,如果能读到就直接返回该字符,否则调用read(2),把文件描述符传进去,让内核读取该文件的数据到I/O缓冲区,然后返回下一个字符。
③fputc(3)
判断该文件的I/O缓冲区是否有空间再存放一个字符,如果有空间则直接保存在I/O缓冲区中并返回,如果I/O缓冲区已满就调用write(2),让内核把I/O缓冲区的内容写回文件。
#include <stdio.h>
int main(void) {
int i;
for (int i = 0; i < 1025; i++) {
fputc('A', stdout);
}
return 0;
}
④fclose(4)
如果I/O缓冲区中还有数据没写回文件,就调用write(2)写回文件,然后调用close(2)关闭文件,释放FILE结构体和I/O缓冲区。
2.标准库函数与系统调用
每个进程在Linux内核中都有一个task_struct结构体来维护进程相关的信息,称为进程控制块(PCB,Process Control Block)。
taks_struct中有一个指针指向files_struct结构体,称为文件描述符表,其中每个表项包含一个指向已打开的文件的指针,用户程序不能直接访问内核中的文件的描述符表,而只能使用文件描述符表的索引,这些索引就称为文件的描述符,用int型变量保存。
句柄思想。
程序启动时会自动打开三个文件:
①标准输入 ②标准输出 ③标准错误输出
在C标准库中分开用FILE *指针stdin,stdout和stderr表示。
这三个文件的描述符分别是0,1,2,保存在相应的FILE结构体中。
头文件unistd.h中有如果的宏定义来表示这个文件描述符:
#include <stdio.h>
#include <unistd.h>
int main(void) {
printf("%d\n",STDIN_FILENO);
printf("%d\n",STDOUT_FILENO);
printf("%d\n",STDERR_FILENO);
return 0;
}
更多推荐
系统编程入门
发布评论