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 
",argc);

    for(int i=0;i<argc;i++)
    {
        printf("argv[%d] = %s 
",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!
");
    }

    printf("fd = %d 
",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
");
        return -1;
    }

    printf("fd is %d
",fd);

    ret = read(fd,buf,32);
    if(ret < 0)
    {
        printf("read is error
");
        return -2;
    }

    printf("buf is %s
",buf);
    printf("ret is %d
",ret);
    
    close(fd);

    return 0;
}

原文地址:https://www.cnblogs.com/doitjust/p/14644680.html