Linux编程-回忆录一

====系统调用====
是应用程序和系统内核之间的API接口
是系统内核对外提供的一系列功能服务
系统调用的基本要点:
    a.CPU从用户模式切换到内核模式
    b.系统调用被优化了下,使用的是函数名称,而非调用数字号
    c.系统调用可以从用户模式传递参数到内核模式,反之亦然
如果想要通过函数调用号使用系统调用,可以看看syscall函数的说明
系统调用看起来跟使用C函数差不多,使用函数名称来使用的系统调用
实际它的步骤比较多:
1.使用函数名的调用,实际是C语言库里面的wrapper函数
2.传递给wrapper函数的参数,都是通过栈的方式,wrapper函数再把栈上
参数拷贝到内核预定的寄存器中
3.因为所有的系统调用形式都是一样的,所以wrapper函数拷贝系统调用号
到eax寄存器中,标明使用的是哪个系统调用
4.wrapper函数执行trap(int 0x80)中断,使得CPU从用户模式切换到内核模式
执行中断向量表
5.内核使用system_call汇编子过程执行系统调用:
    保存当前的寄存器内容    
    检查系统调用号
    执行系统调用
    恢复寄存器内容并将结果存放到栈上
    返回到wrapper函数,从内核模式切换到用户模式
6.如果系统调用出错,会设置全局变量errno的值<表明错误原因>,并从
wrapper函数返回一个值表明调用出错

====库函数====
多种功能构成的C语言标准函数之一。大多数库函数不使用系统调用,一般都抽象在
系统调用之上,最常用的库版本是GNU C Library(glibc).
命令行执行/lib64/libc.so.6 或者/lib/libc.so.6可以打印版本相关的信息

====获取库版本信息====
#include <gnu/libc-version.h>
const char *gnu_get_libc_version(void);
返回一个以‘\0‘字符结尾的静态分配的字符串,类似2.12的字符串信息
同类型的函数有一个叫confstr
#include <unistd.h>
size_t confstr(int name, char *buf, size_t len);
使用方式类似confstr(_CS_GNU_LIBC_VERSION, buf, sizeof(buf));
上述两个函数的结果打印类似下面的样本:
gnue_get_libc_version return: 2.12
confstr return: glibc 2.12

====处理错误====
#include <stdio.h>
void perror(const char *msg);
打印一个指向msg参数,后跟当前errno错误描述的字符串,输出到stderr流
#include <string.h>
char *strerror(int errnum);
返回一个静态分配的描述errnum错误信息的字符串,需要注意的是,该函数
返回指针指向的内容会被下一次该函数的调用覆盖,不适合多线程使用

时间: 2024-10-21 00:46:53

Linux编程-回忆录一的相关文章

Linux编程-回忆录二

====文件IO====Linux系统IO操作都是使用文件描述符来代表打开的文件,一个非负的的整数,它被用来指所有类型的打开的文件,包括管道,FIFO,网络套接字,终端,设备和一般文件.每个进程都有自己的一套文件描述符 经常使用的三个文件描述符是:标准输入(stdin,  STDIN_FILENO,  0)标准输出(stdout, STDOUT_FILENO, 1)标准错误(stderr, STDERR_FILENO, 2) #include <sys/stat.h>#include <

Linux编程-回忆录三

====系统环境====#include <unistd.h>pid_t getpid(void);得到当前进程的进程ID号,永远成功 #include <stdlib.h>char *getenv(const char *name);得到给定环境变量名称的值,如果没有该变量,返回NULL值 #include <stdlib.h>int putenv(char *string);添加一个新的环境变量,传入的字符串格式为: "name=value"传入

Linux编程基础

一.Linux编程环境 1. 程序编辑器: 命令模式: i(insert):插入 a(after):之后插入 x():删除字符 dd:删除一行 :行号进行指定 :/字符串:搜索字符串 :q,退去 :wq ndd:删除n行 yy:复制当前行 p:粘贴 ny:从当前航开始复制 2. gcc gcc -s  text.c gcc  -c text.c gcc -o text  text.c gcc -o text test1.o text2.o 二.调试工具 1. gdb 执行调试命令:gdb tes

Linux编程---信号处理

信号是一种异步的进程间通信的方式.但是这种通知方式能交换的信息很少.只能说给一个事件的标志.类似单片机中的中断,强迫进程停止做当前应当做的事情,而去执行中断执行程序. 信号的产生有如下几种: 1.用户按下了某个终止键,如ctrl-\或ctrl-c.是由终端程序向当前进程发送一个中断信号. 2.程序异常.比如除零错误. 3.kill函数向其发送了一个终止信号 4.进程向自己发送信号.如进程调用alarm函数. 5.企图读写终端的后台进程会得到作业的控制信号SIGTTIN或SIGTOU. 6.当进程

Linux编程---I/O部分

非常多函数都能够在网上找到,也比較基础,所以原型仅仅给出了函数名.详细用到再man吧. 输入输出是个非常重要的一块内容.差点儿网络相关的东西基本都是靠底层IO调用来实现的. 好吧.还是先踏踏实实的介绍一下C标准库中的IO函数吧.个别函数我也是第一次见.对于不太常见的我就多解释一下,反正通常这些函数百度一下就清楚了,我就不多解释了~ 1.C标准库IO函数 1.1流的关闭开启与重定向 fopen:打开一个流 fclose:关闭一个流 freopen:又一次打开一个流 1.2 读与写 读: fgetc

【Linux编程】存储映射I/O

存储映射I/O使一个磁盘文件与存储空间中的一个缓冲区相映射,对缓冲区的读.写操作就是对文件的读.写操作,从而可以不再使用read.write系统调用. 将文件映射到存储区的函数由mmap完成,函数原型如下: #include <sys/mman.h> /* 成功返回映射区起始地址,出错返回MAP_FAILED */ void *mmap(void *addr, size_t len, int prot, int flag, int filedes, off_t off); 参数说明: addr

每天进步一点点——Linux编程中的文件锁之flock

转载请说明出处:http://blog.csdn.net/cywosp/article/details/30083015 1. 场景概述 在多线程开发中,互斥锁可以用于对临界资源的保护,防止数据的不一致,这是最为普遍的使用方法.那在多进程中如何处理文件之间的同步呢?我们看看下面的图: 图中所示的是两个进程在无同步的情况下同时更新同一个文件的过程,其主要的操作是: 1. 从文件中读取序号. 2. 使用这个序号完成应用程序定义的任务. 3. 递增这个序号并将其写回文件中. 从图中可得知两个进程读取分

linux编程中接收主函数返回值以及错误码提示

程序A创建子进程,并调用进程B,根据不调用的不同情况,最后显示结果不同. #include <stdio.h> #include <unistd.h> #include <sys/wait.h> #include <sys/types.h> #include <errno.h> int main() { pid_t pid, rpid; int stat; if ((pid = fork()) < 0) { perror("for

Linux编程报错

学习<Linux编程第四版>时遇到问题: 报错: 错误:'sem_union'的存储大小未知 原因: Linux 2.6版内核union sem_union 联合体已被注释 解决方法: 重新定义sem_union union semun{    int val;    struct semid_ds *buf;    unsigned short *array;    struct seminfo *__buf;};