Linux系统编程
1. 什么是Linux系统编程
Linux系统编程也叫Linux下的高级编程;
学习Linux系统编程C语言是基础,能够在Linux系统下通过指令完成文件的创建、复制、剪切、删除;文件夹的创建和删除;软件的下载和安装就可以。
Linux系统编程主要是学习Linux系统调用的接口,学习这些接口的功能、参数和返回值,是比较简单的。可以通过框架学习法来学习。(迅为的框架学习法)
2. Linux系统编程的基本框架
#include <stdio.h> #include <stdlib.h> int main(int argc,char *argv[]) { //argc:表示的是命令行中参数的个数。最小为1 //argv:表示的是命令行中的参数。 printf("argc = %d \n",argc); for(int i=0;i<argc;i++) { printf("argv[%d] = %s \n",i,argv[i]); } return 0; }
3. 标准IO和文件IO
文件IO就是直接调用系统内核提供的系统调用函数,如open;
标准IO就是间接调用系统调用函数,是C库函数,如fopen。
文件IO和标准IO的区别?
文件IO是直接调用系统内核提供的系统调用函数,头文件是unistd.h;标准IO是间接调用系统函数,头文件是stdio.h
文件IO是依赖于操作系统的;标准IO是不依赖于操作系统的。所以在任何操作系统下,使用标准IO,也就是C库函数操作文件的方法都是相同的。
4. 文件IO之open函数
文件描述符
对于文件IO来说,一切都是围绕文件描述符进行的。在Linux系统中,所有打开的文件都有一个对应的文件描述符。
文件描述符的本质是一个非负整数,当我们打开一个文件时,系统会给我们分配一个文件描述符。
当我们对一个文件做读写操作的时候,我们使用open函数返回的这个文件描述符会标识该文件,并将其作为参数传递给read或write函数。
在posix.1应用程序里面,文件描述符0,1,2分别标识标准输入,标准输出和标准出错。
open函数
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode);
功能:打开文件,返回文件描述符。
open函数有两个原型,参数不同。
第一个参数:表示要打开文件的路径。
第二个参数:O_RDONLY,O_WRONLY,O_RDWR。O_CREAT等等。可以通过 | 组合使用
第三个参数:当第二个参数中有O_CREAT时,需要填写第三个参数,表示访问权限。文件实际的访问权限: mode & ~(umask)
返回值:正常返回打开文件的描述符;-1:打开错误
文件的访问权限
文件的访问权限可以由数字表示:
可执行 -- 1 可写 -- 2 可读 -- 4
如果我们表示文件可读可写,就是上述值的和,可读可写 -- 6。
open.c
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> int main(int argc,char *argv[]) { int fd; fd = open("a.c",O_CREAT|O_RDWR,0666); if(fd < 0){ printf("open is error!\n"); } printf("fd = %d \n",fd); close(fd); return 0; }
umask 是 022 ,open第三个参数是 666 ,mode & ~(umask) = 644
5.文件IO之close函数
close函数
#include <unistd.h> int close(int fd);
作用:关闭一个文件描述符
参数:文件描述符
返回值:0-成功 -1-失败。
为什么要关闭文件描述符?
系统中的文件描述符是有上限的,一般为1024。关闭不用的文件描述符以让内核可以重用。
6.文件IO之read函数
read函数
#include <unistd.h> ssize_t read(int fd, void *buf, size_t count);
作用:读出文件描述符fd所指向的文件中,count字节的数据到buf指向的缓冲区。
参数: fd:文件描述符
buf:读出数据的缓冲区
count:要读出数据的字节长度
返回值:n - 实际读取到数据的字节长度
0 - 读到文件末尾
-1 - 读取出错
read.c
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> int main(int argc,char *argv[]) { int fd; char buf[32]; ssize_t ret; fd = open("a.c",O_RDWR); if(fd < 0) { printf("open is error\n"); return -1; } printf("fd is %d\n",fd); ret = read(fd,buf,32); if(ret < 0) { printf("read is error\n"); return -2; } printf("buf is %s\n",buf); printf("ret is %d\n",ret); close(fd); return 0; }