系统编程入门

 一、什么是系统编程?

系统编程就是利用系统调用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;
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值