Linux系统API函数手册
(一)文件操作篇 1、creat(建立文件) 头文件 1 #include 2 #include 3 #include 定义函数 1 int creat(const char * pathname, mode_tmode); 函数说明 参数pathname指向欲建立的文件路径字符串。creat()相当于使用下列的调用方式调用open() 1 open(const char * pathname ,(O_CREAT|O_WRONLY|O_TRUNC)); 错误代码 关于参数mode请参考open()函数。 返回值 creat()会返回新的文件描述词,若有错误发生则会返回-1,并把错误代码设给errno。 EEXIST 参数pathname所指的文件已存在。 EACCESS 参数pathname 所指定的文件不符合所要求测试的权限 EROFS 欲打开写入权限的文件存在于只读文件系统内 EFAULT 参数pathname 指针超出可存取的内存空间 EINVAL 参数mode 不正确。 ENAMETOOLONG 参数pathname太长。 ENOTDIR 参数pathname为一目录 ENOMEM 核心内存不足 ELOOP 参数pathname有过多符号连接问题。 EMFILE 已达到进程可同时打开的文件数上限 ENFILE 已达到系统可同时打开的文件数上限 附加说明 creat()无法建立特别的装置文件,如果需要请使用mknod()。 2、open(打开文件) 头文件 1 #include 2 #include 3 #include 定义函数 1 int open( const char * pathname, int flags); 2 int open( const char * pathname,int flags, mode_t mode); 函数说明 参数pathname 指向欲打开的文件路径字符串。下列是参数flags 所能使用的旗标: O_RDONLY 以只读方式打开文件 O_WRONLY 以只写方式打开文件 O_RDWR 以可读写方式打开文件。上述三种旗标是互斥的,也就是不可同时使用,但可与下列的旗标利用OR(|)运算符组合。 O_CREAT 若欲打开的文件不存在则自动建立该文件。 O_EXCL 如果O_CREAT 也被设置,此指令会去检查文件是否存在。文件若不存在则建立该文件,否则将导致打开文件错误。此外,若O_CREAT与O_EXCL同时设置,并且欲打开的文件为符号连接,则会打开文件失败。 O_NOCTTY 如果欲打开的文件为终端机设备时,则不会将该终端机当成进程控制终端机。 O_TRUNC 若文件存在并且以可写的方式打开时,此旗标会令文件长度清为0,而原来存于该文件的资料也会消失。 O_APPEND 当读写文件时会从文件尾开始移动,也就是所写入的数据会以附加的方式加入到文件后面。 O_NONBLOCK 以不可阻断的方式打开文件,也就是无论有无数据读取或等待,都会立即返回进程之中。 O_NDELAY 同O_NONBLOCK。 O_SYNC 以同步的方式打开文件。 O_NOFOLLOW 如果参数pathname 所指的文件为一符号连接,则会令打开文件失败。 O_DIRECTORY 如果参数pathname 所指的文件并非为一目录,则会令打开文件失败。 此为Linux2.2以后特有的旗标,以避免一些系统安全问题。参数mode 则有下列数种组合,只有在建立新文件时才会生效,此外真正建文件时的权限会受到umask值所影响,因此该文件权限应该为(mode-umaks)。 S_IRWXU00700 权限,代表该文件所有者具有可读、可写及可执行的权限。 S_IRUSR 或S_IREAD,00400权限,代表该文件所有者具有可读取的权限。 S_IWUSR 或S_IWRITE,00200 权限,代表该文件所有者具有可写入的权限。 S_IXUSR 或S_IEXEC,00100 权限,代表该文件所有者具有可执行的权限。 S_IRWXG 00070权限,代表该文件用户组具有可读、可写及可执行的权限。 S_IRGRP 00040 权限,代表该文件用户组具有可读的权限。 S_IWGRP 00020权限,代表该文件用户组具有可写入的权限。 S_IXGRP 00010 权限,代表该文件用户组具有可执行的权限。 S_IRWXO 00007权限,代表其他用户具有可读、可写及可执行的权限。 S_IROTH 00004 权限,代表其他用户具有可读的权限 S_IWOTH 00002权限,代表其他用户具有可写入的权限。 S_IXOTH 00001 权限,代表其他用户具有可执行的权限。 返回值 若所有欲核查的权限都通过了检查则返回0 值,表示成功,只要有一个权限被禁止则返回-1。 错误代码 EEXIST 参数pathname 所指的文件已存在,却使用了O_CREAT和O_EXCL旗标。 EACCESS 参数pathname所指的文件不符合所要求测试的权限。 EROFS 欲测试写入权限的文件存在于只读文件系统内。 EFAULT 参数pathname指针超出可存取内存空间。 EINVAL 参数mode 不正确。 ENAMETOOLONG 参数pathname太长。 ENOTDIR 参数pathname不是目录。 ENOMEM 核心内存不足。 ELOOP 参数pathname有过多符号连接问题。 EIO I/O 存取错误 3、close(关闭文件) 头文件 1 #include 定义函数 1 int close(int fd); 函数说明 当使用完文件后若已不再需要则可使用close()关闭该文件,二close()会让数据写回磁盘,并释放该文件所占用的资源。参数fd为先前由open()或creat()所返回的文件描述词。 返回值 若文件顺利关闭则返回0,发生错误时返回-1。 错误代码 EBADF 参数fd 非有效的文件描述词或该文件已关闭。 附加说明 虽然在进程结束时,系统会自动关闭已打开的文件,但仍建议自行关闭文件,并确实检查返回值。 4、read(由已打开的文件读取数据) 头文件 1 #include 定义函数 1 ssize_t read(int fd,void * buf ,size_t count); 函数说明 read()会把参数fd 所指的文件传送count个字节到buf指针所指的内存中。若参数count为0,则read()不会有作用并返回0。返回值为实际读取到的字节数,如果返回0,表示已到达文件尾或是无可读取的数据,此外文件读写位置会随读取到的字节移动。 附加说明 如果顺利read()会返回实际读到的字节数,最好能将返回值与参数count 作比较,若返回的字节数比要求读取的字节数少,则有可能读到了文件尾、从管道(pipe)或终端机读取,或者是read()被信号中断了读取动作。当有错误发生时则返回-1,错误代码存入errno中,而文件读写位置则无法预期。 错误代码 EINTR 此调用被信号所中断。 EAGAIN 当使用不可阻断I/O 时(O_NONBLOCK),若无数据可读取则返回此值。 EBADF 参数fd 非有效的文件描述词,或该文件已关闭。 5、write(将数据写入已打开的文件内) 头文件 1 #include 定义函数 1 ssize_t write (int fd,const void * buf,size_t count); 函数说明 write()会把参数buf所指的内存写入count个字节到参数fd所指的文件内。当然,文件读写位置也会随之移动。 返回值 如果顺利write()会返回实际写入的字节数。当有错误发生时则返回-1,错误代码存入errno中。 错误代码 EINTR 此调用被信号所中断。 EAGAIN 当使用不可阻断I/O 时(O_NONBLOCK),若无数据可读取则返回此值。 EADF 参数fd非有效的文件描述词,或该文件已关闭。 6、flock(锁定文件或解除锁定) 头文件 1 #include 定义函数 1 int flock(int fd,int operation); 函数说明 flock()会依参数operation所指定的方式对参数fd所指的文件做各种锁定或解除锁定的动作。此函数只能锁定整个文件,无法锁定文件的某一区域。 参数 operation有下列四种情况: LOCK_SH 建立共享锁定。多个进程可同时对同一个文件作共享锁定。 LOCK_EX 建立互斥锁定。一个文件同时只有一个互斥锁定。 LOCK_UN 解除文件锁定状态。 LOCK_NB 无法建立锁定时,此操作可不被阻断,马上返回进程。通常与LOCK_SH或LOCK_EX 做OR(|)组合。 单一文件无法同时建立共享锁定和互斥锁定,而当使用dup()或fork()时文件描述词不会继承此种锁定。 返回值 返回0表示成功,若有错误则返回-1,错误代码存于errno。 7、lseek(移动文件的读写位置) 头文件 1 #include 2 #include 定义函数 1 off_t lseek(int fildes,off_t offset ,int whence); 函数说明 每一个已打开的文件都有一个读写位置,当打开文件时通常其读写位置是指向文件开头,若是以附加的方式打开文件(如O_APPEND),则读写位置会指向文件尾。当read()或write()时,读写位置会随之增加,lseek()便是用来控制该文件的读写位置。参数fildes 为已打开的文件描述词,参数offset 为根据参数whence来移动读写位置的位移数。 参数 whence为下列其中一种: SEEK_SET 参数offset即为新的读写位置。 SEEK_CUR 以目前的读写位置往后增加offset个位移量。 SEEK_END 将读写位置指向文件尾后再增加offset个位移量。 当whence 值为SEEK_CUR 或SEEK_END时,参数offet允许负值的出现。 下列是教特别的使用方式: 1) 欲将读写位置移到文件开头时:lseek(int fildes,0,SEEK_SET); 2) 欲将读写位置移到文件尾时:lseek(int fildes,0,SEEK_END); 3) 想要取得目前文件位置时:lseek(int fildes,0,SEEK_CUR); 返回值 当调用成功时则返回目前的读写位置,也就是距离文件开头多少个字节。若有错误则返回-1,errno 会存放错误代码。 附加说明 Linux系统不允许lseek()对tty装置作用,此项动作会令lseek()返回ESPIPE。
linux驱动开发(一)
linux驱动开发(⼀)1:驱动开发环境要进⾏linux驱动开发我们⾸先要有linux内核的源码树,并且这个linux内核的源码树要和开发板中的内核源码树要⼀直;⽐如说我们开发板中⽤的是linux kernel内核版本为2.6.35.7,在我们ubuntu虚拟机上必须要有同样版本的源码树,我们再编译好驱动的的时候,使⽤modinfo XXX命令会打印出⼀个版本号,这个版本号是与使⽤的源码树版本有关,如果开发板中源码树中版本与modinfo的版本信息不⼀致使⽆法安装驱动的;我们开发板必须设置好nfs挂载;这些在根⽂件系统⼀章有详细的介绍;2:开发驱动常⽤的⼏个命令lsmod :list moduel 把我们机器上所有的驱动打印出来,insmod:安装驱动rmmod:删除驱动modinfo:打印驱动信息3:写linux驱动⽂件和裸机程序有很⼤的不同,虽然都是操作硬件设备,但是由于写裸机程序的时候是我们直接写代码操作硬件设备,这只有⼀个层次;⽽我们写驱动程序⾸先要让linux内核通过⼀定的接⼝对接,并且要在linux内核注册,应⽤程序还要通过内核跟应⽤程序的接⼝相关api来对接;4:驱动的编译模式是固定的,以后编译驱动的就是就按照这个模式来套即可,下⾯我们来分下⼀下驱动的编译规则:#ubuntu的内核源码树,如果要编译在ubuntu中安装的模块就打开这2个#KERN_VER = $(shell uname -r)#KERN_DIR = /lib/modules/$(KERN_VER)/build# 开发板的linux内核的源码树⽬录KERN_DIR = /root/driver/kernelobj-m += module_test.oall:make -C $(KERN_DIR) M=`pwd` modulescp:cp *.ko /root/porting_x210/rootfs/rootfs/driver_test.PHONY: cleanclean:make -C $(KERN_DIR) M=`pwd` modules cleanmake -C $(KERN_DIR) M=`PWD` modules这句话代码的作⽤就是到 KERN_DIR这个⽂件夹中 make modules把当前⽬录赋值给M,M作为参数传到主⽬录的Makefile中,实际上是主⽬录的makefile中有⽬标modules,下⾯有⼀定的规则来编译驱动;#KERN_VER = $(shell uname -r)#KERN_DIR = /lib/modules/$(KERN_VER)/build我们在ubuntu中编译内核的时候⽤这两句代码,因为在ubuntu中为我们保留了⼀份linux内核的源码树,我们编译的时候直接调⽤那个源码树的主Makefile以及⼀些头⽂件、内核函数等;了解规则以后,我们设置好KERN_DIR、obj-m这两个变量以后直接make就可以了;经过编译会得到下⾯⼀些⽂件:下⾯我们可以使⽤lsmod命令来看⼀下我们ubuntu机器现有的⼀些驱动可以看到有很多的驱动,下⾯我们使⽤insmod XXX命令来安装驱动,在使⽤lsmod命令看⼀下实验现象可以看到我们刚才安装的驱动放在了第⼀个位置;使⽤modinfo来打印⼀下驱动信息modinfo xxx.ko这⾥注意vermagic 这个的1.8.0-41是你⽤的linux内核源码树的版本号,只有这个编译的版本号与运⾏的linux内核版本⼀致的时候,驱动程序才会被安装注意license:GPL linux内核开元项⽬的许可证⼀般都是GPL这⾥尽量设置为GPL,否则有些情况下会出现错误;下⾯使⽤rmmod xxx删除驱动;-------------------------------------------------------------------------------------5:下⾯我们分析⼀下驱动。
Unix_Linux_Windows_OpenMP多线程编程
Unix_Linux_Windows_OpenMP多线程编程第三章 Unix/Linux 多线程编程[引言]本章在前面章节多线程编程基础知识的基础上,着重介绍 Unix/Linux 系统下的多线程编程接口及编程技术。
3.1 POSIX 的一些基本知识POSIX 是可移植操作系统接口(Portable Operating SystemInterface)的首字母缩写。
POSIX 是基于 UNIX 的,这一标准意在期望获得源代码级的软件可移植性。
换句话说,为一个 POSIX 兼容的操作系统编写的程序,应该可以在任何其它的 POSIX 操作系统(即使是来自另一个厂商)上编译执行。
POSIX 标准定义了操作系统应该为应用程序提供的接口:系统调用集。
POSIX是由 IEEE(Institute of Electrical andElectronic Engineering)开发的,并由 ANSI(American National Standards Institute)和 ISO(International StandardsOrganization)标准化。
大多数的操作系统(包括 Windows NT)都倾向于开发它们的变体版本与 POSIX 兼容。
POSIX 现在已经发展成为一个非常庞大的标准族,某些部分正处在开发过程中。
表 1-1 给出了 POSIX 标准的几个重要组成部分。
POSIX 与 IEEE 1003 和 2003 家族的标准是可互换的。
除 1003.1 之外,1003 和 2003 家族也包括在表中。
管理 POSIX 开放式系统环境(OSE) 。
IEEE 在 1995 年通过了这项标准。
ISO 的1003.0版本是 ISO/IEC 14252:1996。
被广泛接受、用于源代码级别的可移植性标准。
1003.1 提供一个操作系统的C 语1003.1 言应用编程接口(API) 。
IEEE 和 ISO 已经在 1990 年通过了这个标准,IEEE 在1995 年重新修订了该标准。
linux内核通信-netlink使用例子
Netlink 是一种特殊的socket,它是Linux 所特有的,类似于BSD 中的AF_ROUTE 但又远比它的功能强大,目前在最新的Linux 内核(2.6.14)中使用netlink 进行应用与内核通信的应用很多,包括:路由daemon (NETLINK_ROUTE),1-wire 子系统(NETLINK_W1),用户态socket 协议(NETLINK_USERSOCK),防火墙(NETLINK_FIREWALL),socket 监视(NETLINK_INET_DIAG),netfilter 日志(NETLINK_NFLOG),ipsec 安全策略(NETLINK_XFRM),SELinux 事件通知(NETLINK_SELINUX),iSCSI 子系统(NETLINK_ISCSI),进程审计(NETLINK_AUDIT),转发信息表查询(NETLINK_FIB_LOOKUP),netlinkconnector(NETLINK_CONNECTOR),netfilter 子系统(NETLINK_NETFILTER),IPv6 防火墙(NETLINK_IP6_FW),DECnet 路由信息(NETLINK_DNRTMSG),内核事件向用户态通知(NETLINK_KOBJECT_UEVENT),通用netlink (NETLINK_GENERIC)。
Netlink 是一种在内核与用户应用间进行双向数据传输的非常好的方式,用户态应用使用标准的socket API 就可以使用netlink 提供的强大功能,内核态需要使用专门的内核API 来使用netlink。
Netlink 相对于系统调用,ioctl 以及/proc 文件系统而言具有以下优点:1,为了使用netlink,用户仅需要在include/linux/netlink.h 中增加一个新类型的netlink 协议定义即可,如#define NETLINK_MYTEST 17 然后,内核和用户态应用就可以立即通过socket API 使用该netlink 协议类型进行数据交换。
posix 消息队列
MagicARM2410 教学实验开发平台
5 .实验原理
__u32 hsync_len; sync */ __u32 vsync_len; */ __u32 sync; __u32 vmode; __u32 reserved[6]; compatibility */ }; /* length of horizontal /* length of vertical sync /* see FB_SYNC_* /* see FB_VMODE_* /* Reserved for future */ */
所有这些特性让应用程序十分容易地使用设 备。 MiniGUI 和 QT 等 GUI 软件可以使用 /dev/fb* 而 不需知道硬件的寄存器是如何组织的。 使用 read 、 write 函数在读或写之前持续的寻址 将会导致很多的开销。这就是为什么要映射屏幕内存。 当你将屏幕内存映射到你的应用程序时,你将得到一个 直接指向屏幕内存的指针。
MagicARM2410 教学实验开发平台
5 .实验原理
程序清单 1.1 中非常重要的域是 smem_len 和 linelength 。 smem-len 告诉我们 framebuffer 设备的大小,第 二个域告诉我们指针应该前进多少字节去得到下一行的 数据。 可变的屏幕信息使用 FBIOGET_VSCREENINFO 通 过 ioctl() 函数获得,该数据结构则有更多的意思,它给 了我们可以改变的信息,如程序清单 1.2 所示。
2 .实验设备
硬件: PC 机 1台 MagicARM2410 教学实验开发平台 1台 软件: RedHat Linux 9.0 操作系统 Windows 98/2000/XP 操作系统(可 选) 嵌入式 Linux 开发环境
操作系统原理-用户界面
第3章 用户界面
教学内容 用户环境 用户界面概念 操作界面 系统调用
教学重点 操作界面 系统调用
教学难点
系统调用
Linux系统调用机制
3.1 用户环境
3.1 用户环境
用户环境 用户环境是指计算机用户工作的软件环境,包括命 令行环境,桌面环境,以及相关的用户使用手册。 用户环境的构造是指按照用户的要求和硬件特性, 安装和配置好操作系统,为用户提供必要的操作命 令或图形界面,并使其工作方式和交互方式合理高 效,方便用户使用计算机完成相应的工作。
教学重点
3.4.1 系统调用概念
3.4.1 系统调用概念
系统调用 系统调用(System Service Call,System Call)是操作 系统内核为应用程序提供的服务,是应用程序与操 作系统之间的接口。 系统调用一般涉及核心资源或硬件的操作,运行于 核态。 每个系统调用具有唯一的编号。 调用系统调用的过程会产生中断,这种中断是自愿 中断,即是软件中断,也是内部中断。
重定向和管道命令都属于特殊的操作命令。 操作系统定义了两个标准输入和输出设备。
各种程序以键盘作为标准输入设备,以显示器作为 标准输出设备,即任何命令的输入默认来自“键盘”, 任何命令的输出(含错误)默认送往“显示器”。
重定向 重定向即把命令默认的输入来源或输出方向修改为 其他设备(或其他文件,设备视同文件)。 重定向分为输入重定向和输出重定向两种,分别用 “<”及“>”表示。
3.3.6 Shell脚本程序
脚本程序的运行方式 (1)将脚本程序作为程序运行,在命令行直接输入 脚本文件名字
在脚本中为当前脚本指定特定的Shell,需要在脚本文件的 开头增加如下一行代码: #!/bin/bash
write系统调用底层解析
write系统调用底层解析系统调用底层解析是指通过分析操作系统内核的源代码,了解系统调用的实现方式和底层机制。
下面是一个简单的解析系统调用的过程:1. 用户空间调用API函数:在应用程序中,通过调用API函数来发起系统调用请求,比如read()、write()等。
2. 库函数调用:API函数会调用相应的库函数,比如在Linux系统中,应用程序的C语言库会调用glibc库来处理系统调用。
3. 系统调用号:库函数会将API函数的参数打包,包括系统调用号和参数值。
系统调用号对应不同的系统调用,比如read()的系统调用号为0,write()的系统调用号为1。
4. 软中断:库函数将打包好的参数传递给内核,触发一个软中断(软中断是一种软件层面的中断请求)。
5. 内核处理软中断:操作系统内核会捕获软中断,切换到内核模式,并将控制权从用户空间切换到内核空间。
6. 系统调用处理函数:内核根据系统调用号找到对应的系统调用处理函数,比如sys_read()、sys_write()等。
7. 参数传递:内核将用户空间传递的参数从内核栈(或寄存器)中获取,并将其复制到内核空间。
8. 系统调用执行:系统调用处理函数根据参数执行相应的系统调用操作,比如从文件中读取数据或向文件中写入数据。
9. 结果返回:系统调用处理函数将执行结果存储到内核空间的特定位置,并将控制权返回给用户空间。
10. 库函数返回:库函数从内核空间获取系统调用执行结果,并将其返回给应用程序。
11. 应用程序处理结果:应用程序获取到系统调用的执行结果,并根据需要进行相应的处理。
需要注意的是,不同操作系统的系统调用底层实现方式可能有所不同,上述过程是一个简化的描述,实际底层实现可能会更加复杂。
pthread_exit参数
pthread_exit参数pthread_exit函数是线程库中的一个函数,其作用是终止当前线程并返回一个指定的退出状态。
这个退出状态可以被其他线程通过pthread_join函数获取到。
pthread_exit的参数是一个指向线程的退出状态的指针。
pthread_exit函数的原型如下:```cvoid pthread_exit(void *retval);```参数retval是指向线程退出状态的指针。
该状态可以被其他线程通过pthread_join函数获取。
pthread_exit函数会阻塞当前线程,直到其他线程调用pthread_join函数或者主线程结束。
如果当前线程是主线程,那么调用pthread_exit函数等同于调用exit函数,会终止整个进程。
以下是pthread_exit函数的一些参考内容:1. 《UNIX网络编程卷一:套接字联网API》这本书是经典的UNIX网络编程指南,第11章介绍了线程的创建和终止。
其中有关于pthread_exit的用法和示例代码。
2. 《Linux/UNIX系统编程手册》这本书是UNIX/Linux系统编程的权威参考书,第31章介绍了线程的控制以及pthread库的使用。
其中涵盖了pthread_exit 函数的详细说明和示例代码。
3. 《POSIX线程编程》这本书详细介绍了POSIX线程编程的各个方面。
其中第6章介绍了线程控制和退出,包括pthread_exit函数的用法和示例。
4. 《Advanced Programming in the UNIX Environment》这本书是UNIX环境高级编程的经典之作,第12章介绍了线程控制和终止。
其中对pthread_exit函数有详细的解释和示例代码。
5. 《Linux多线程服务端编程》这本书主要介绍了在Linux环境下进行多线程服务端编程的相关知识。
其中有关于pthread_exit函数的用法和示例代码,以及与其他相关函数的关系和比较。
dbus使用方法
dbus使用方法DBus(DesktopBus)是一个用于在Linux和其他类Unix系统上进行进程之间通信的系统总线。
它是一个由进程之间的消息总线组成的软件总线,可以在本地主机上的多个进程之间进行通信,在本地主机的不同进程之间传递消息,也可以在远程主机之间的进程之间传递消息。
DBus可用于桌面环境下的应用程序之间通信,也可用于系统级应用程序之间通信。
DBus使用方法:1. 安装DBus开发库在Linux系统中,DBus可以通过安装DBus开发库来使用。
DBus 的开发库有很多种,如libdbus-1、dbus-glib等。
在安装开发库之前,需要确保已经安装了DBus运行库。
安装完成后,可以使用DBus 的API函数或DBus自带的工具来使用DBus。
2. 使用DBus API函数DBus提供了一组API函数供程序员使用。
这些API函数可以用于DBus系统总线的连接、发送和接收消息等操作。
DBus API函数可以使用C、C++、Python等编程语言进行编写。
DBus API函数的使用需要理解DBus的基本概念和原理。
3. 使用DBus自带的工具DBus自带了一些工具,如dbus-send、dbus-monitor等。
使用这些工具可以进行DBus通信的测试和调试。
dbus-send可以用于在DBus系统总线上发送消息,dbus-monitor可以用于监听DBus系统总线的消息。
DBus是一个高效、灵活的进程间通信机制,可以在Linux和其他类Unix系统上使用。
它适用于桌面环境下的应用程序之间通信,也适用于系统级应用程序之间通信。
DBus的使用方法包括安装DBus 开发库、使用DBus API函数和DBus自带的工具。
使用DBus可以提高系统的可靠性和安全性,提高程序的灵活性和可扩展性。
tar函数
tar函数中的特定函数1. 函数定义在Linux系统中,tar是一个常用的文件归档命令,也是一个文件压缩命令。
tar函数是tar命令的核心函数库,用于对文件进行打包、压缩和解压缩操作。
tar函数提供了一系列API函数,用于在C语言程序中调用tar命令的功能。
2. 函数用途tar函数主要用于对文件进行打包、压缩和解压缩操作。
它可以将多个文件或目录打包成一个单独的文件,方便传输和存储。
同时,它也可以将打包的文件进行压缩,减小文件的大小,节省存储空间。
另外,tar函数还可以对压缩的文件进行解压缩,恢复成原始的文件。
3. 函数工作方式tar函数主要通过调用系统的底层函数和命令实现文件的打包、压缩和解压缩操作。
下面介绍几个常用的tar函数及其工作方式:a. tar_open函数tar *tar_open(const char *pathname, const char *mode, mode_t mode, int options, int error);•函数作用:打开一个tar文件。
•参数解释:–pathname:tar文件的路径。
–mode:打开模式,可以是"r"(只读)、"w"(只写)、"a"(追加)等。
–options:选项,可以指定一些额外的行为。
–error:错误处理方式。
•工作方式:根据参数指定的路径和模式,打开一个tar文件,并返回一个指向tar结构的指针。
b. tar_append文件int tar_append(tar *t, const char *pathname, int options);•函数作用:向一个已打开的tar文件中追加文件。
•参数解释:–t:tar结构的指针,表示已打开的tar文件。
–pathname:要追加的文件的路径。
–options:选项,可以指定一些额外的行为。
•工作方式:根据参数指定的路径,将对应的文件追加到已打开的tar文件中。
什么是API,如何区分API和SDK?
什什么是API,如何区分API和SDK?1.API的概念API即“应⽤用程序编程接⼝口”,是⼀一些预先定义的函数,⽬目的是作为“介⾯面”沟通两个不不同的东⻄西,提供应⽤用程序与开发⼈人员基于某软件或硬件得以访问⼀一组例例程的能⼒力力,⽽而⼜又⽆无需访问源码,或理理解内部⼯工作机制的细节。
其实就是别⼈人已经写好的可以实现特定功能的函数,⽽而你只需要根据他提供好的接⼝口,也就是调⽤用他的⽅方法,传⼊入他规定的参数,然后这个函数就会帮你实现这些功能。
也就是操作系统留留给应⽤用程序的⼀一个调⽤用接⼝口,应⽤用程序通过调⽤用操作系统的 API ⽽而使操作系统去执⾏行行应⽤用程序的命令(动作)。
从接⼝口interface来说,在计算机领域是指两个不不同事物之间交互的地⽅方,⼤大可以到两个完整的不不同系统,⼩小可以到两段程序。
所以这个I就这么理理解。
在这个基础上,⼈人和程序交互的地⽅方,叫做UI,user interface,所有⼈人输⼊入的包括⿏鼠标键盘触摸屏声⾳音输⼊入都算。
那么程序和程序交互的就叫做API,所有⾮非⼈人对⾮非⼈人交互都通过API进⾏行行交互,所谓交互,其实就是传递数据,触发功能。
2.应⽤用案例例(1)示例例场景:你是⼀一家⼩小企业,公司⽹网站上有⼀一个表格是⽤用来给客户注册预约的。
你想要凭借这些预约细节信息,让客户能够⾃自动在⾕谷歌⽇日程上创建活动。
(2)API使⽤用:这就意味着,你的⽹网站服务器器需要直接与⾕谷歌服务器器进⾏行行对话,在掌握既定细节信息的情况下,申请创建活动。
之后,你的服务器器就会接收到⾕谷歌的响应并进⾏行行处理理,然后将相关信息发送回浏览器器,⽐比如说向⽤用户发送⼀一个确认信息。
(3)现在也有公司将API包装成产品案例例:Weather Underground出售其天⽓气数据API的访问权限给其他⼈人。
3.API的分类API⼜又分为(Windows、Linux、Unix等系统的)系统级API,及⾮非操作系统级的⾃自定义API。
