1、进程是处于活动状态的程序,某个用户通过操作系统运行程序所产生的进程代表着该用户的行为。如果用户不具备访问某个目录和文件的权限,那么该用户的进程也不能访问。

2、Linux系统中文件安全机制是通过给系统中的文件赋予两个属性来实现的,这两个属性分别是所有者属性和访问权限属性。Linux系统下的每一个文件必须严格地属于一个用户和一个组,针对不同的用户和组又具有不同的访问权限。

3、系统调用是Linux内核提供的功能十分强大的一系列的函数。这些函数是在内核中实现的,他们是应用程序和内核交互的接口,如图所示。

4、打开文件操作使用系统调用函数open(),该函数的作用是建立一个文件描述符,其他的函数可以通过文件描述符对指定文件进行读取与写入的操作。

新建目录操作可使用函数mkdir()实现

获得当前子目录的操作可使用函数getwd(),

重新指定调用进程的当前工作目录 chdir(const char* pathname)

删除目录操作可使用函数rmdir()完成,该函数的一般形式是:rmdir(路径),该函数必须是在该目录下没有子目录或文件的情况下才能运行。删除文件操作可使用函数unlink,该函数的一般形式是:unlink(路径);

获取文件状态和属性操作可使用fstat()、lstat()和stat()这三个函数来操作。获取的stat结构中有以下属性可以使用:

5、代码:

(1)  FileHandler.c: file type and permission getter

/*
 * FileOpenClose.c
 *
 *  Created on: Jul 9, 2013
 *      Author: root
 */
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(){
    int f;
    const char* f_path="test";
    mode_t f_attrib;
    f_attrib = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH;
    struct stat *buf = malloc(sizeof(stat));
    f= open(f_path, O_RDONLY);
    if(f == -1){
        f = open(f_path, O_RDWR | O_CREAT, f_attrib);
        if(f != -1){
            puts("create a new file successfully");
        }else{
            puts("unble to create a file, program exit");
            return 1;
        }

}else{
        puts("open test file successfully");
    }
    close(f);
    stat(f_path, buf);
    //file mode: user permission
    if(buf->st_mode & S_IRUSR){
        puts("user have read permission!");
    }
    if(buf->st_mode & S_IWOTH){
        puts("other users have write permission.!");
    }else{
        puts("other users don't have write permission.!");
    }
    //file mode: file type.
    switch(buf->st_mode & S_IFMT){
        case S_IFREG: puts("regular\n");break;
        case S_IFDIR: puts("directory\n");break;
        case S_IFCHR: puts("character special");break;
        case S_IFBLK: puts("block special");break;
        case S_IFSOCK:puts("socket");break;
        default:puts("unknown mode");
    }
    return 0;
}

(2) DirectoryHandler.c: open a directory and read its sub files.

#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, char * argv[]){
    char path[1000];
    DIR * dp;
    struct dirent * pdirent;
    if(argc != 2){
        printf("Usage ex3-9 <pathname>\n");
        return 1;
    }
    if((dp=opendir(argv[1])) == NULL){
        printf("OPen dir %s failed.\n", argv[1]);
        return 2;
    }
    while((pdirent=readdir(dp)) != 0){
        printf("%s\n", pdirent->d_name);
    }
    closedir(dp);
    return 0;
}

 (3) DirectoryHandler2.c:  scan  files in a directory

#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>

void scan_dir(char * pathname, int depth){
    DIR * dp;
    dp = opendir(pathname);
    if(dp == NULL){
        puts("directory open failed");
        return;
    }
    chdir(pathname);
    struct dirent * direntPointer;
    //struct stat * pstat = malloc(sizeof(stat));
    struct stat stat;
    while((direntPointer = readdir(dp)) != NULL){
        lstat(direntPointer->d_name, &stat);
        if((strcmp(".", direntPointer->d_name) == 0) ||
                (strcmp("..", direntPointer->d_name) == 0)){
            continue;
        }
        if((strcmp("Debug", direntPointer->d_name) == 0)){
            puts("debug*********");
        }
        if((stat.st_mode & S_IFMT) == S_IFDIR){
            printf("%*s%s\n", depth, "", direntPointer->d_name);
            scan_dir(direntPointer->d_name, depth+4);
        }else{
            printf("%*s%s\n", depth, "", direntPointer->d_name);
            //puts(direntPointer->d_name);
        }
    }
    chdir("..");

closedir(dp);
}

int main(){
    puts("/home directory is \n");
    scan_dir("/home", 0);
    return 0;
}

(4) DirectoryHandler3.c: create directory and file, and delete file and directory. if the directory does'nt have any file, we can delete this directory.

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(){
    mode_t mode;
    mode = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP;
    if(mkdir("testdir", mode) != -1){
        puts("create testdir directory successfully.");
    }
    chdir("./testdir");
    if(creat("testfile", mode) != -1){
        puts("create testfile file successfully.");
    }

if(unlink("testfile") != -1){
        puts("delete testfile file successfully.");
    }
    chdir("..");
    if(rmdir("testdir") != -1){
        puts("delete testdir directory successfully.");
    }

}

LInux文件基础知识和文件目录操作(系统调用函数方式)的更多相关文章

  1. LInux文件基础知识和文件目录操作(二)文件I/O操作

    1.文件I/O操作分为两部分来讲解: 第一部分是非缓冲文件操作,这种操作适合于比较小规模文件的读写和对实时性要求很高的设备的数据通信,这类操作是系统调用提供的: 第二部分是缓冲文件操作,所面向的则是大 ...

  2. Linux文件管理 | Linux 文件基础知识

    目录 Linux 常用文件类别 Linux 目录结构概述 LInux 系统目录及说明 一.Linux 常用文件类别 1.文件   在Linux上系统上,有一切皆文件的说法,就是说任何软件和I/O设备都 ...

  3. Kali Linux渗透基础知识整理(四):维持访问

    Kali Linux渗透基础知识整理系列文章回顾 维持访问 在获得了目标系统的访问权之后,攻击者需要进一步维持这一访问权限.使用木马程序.后门程序和rootkit来达到这一目的.维持访问是一种艺术形式 ...

  4. Kali Linux渗透基础知识整理(二)漏洞扫描

    Kali Linux渗透基础知识整理系列文章回顾 漏洞扫描 网络流量 Nmap Hping3 Nessus whatweb DirBuster joomscan WPScan 网络流量 网络流量就是网 ...

  5. Linux shell基础知识(上)

    Linux shell基础知识(上) 目录 一.shell介绍 二.命令历史 三.命令补全和别名 四.通配符 五.输入输出重定向 六.管道符和作业控制 七.shell变量 八.环境变量配置文件 九.b ...

  6. Linux入门基础知识

    注:内容系兄弟连Linux教程(百度传课:史上最牛的Linux视频教程)的学习笔记. Linux入门基础知识 1. Unix和Linux发展历史 二者就像父子关系,当然Unix是老爹.1965年,MI ...

  7. Greenplum入门——基础知识、安装、常用函数

    Greenplum入门——基础知识.安装.常用函数 2017年10月08日 22:03:09 在咖啡里溺水的鱼 阅读数:8709    版权声明:本文为博主原创,允许非商业性质转载但请注明原作者和出处 ...

  8. [SQL] SQL 基础知识梳理(六)- 函数、谓词、CASE 表达式

    SQL 基础知识梳理(六)-  函数.谓词.CASE 表达式 目录 函数 谓词 CASE 表达式 一.函数 1.函数:输入某一值得到相应输出结果的功能,输入值称为“参数”,输出值称为“返回值”. 2. ...

  9. Linux Shell 基础知识(一)

    1. 本文知识结构 2. shell 基础知识 2.1 shell 简单介绍 ​ GNU bash shell 能提供对 Linux 系统的交互式访问,一般来说,使用快捷键 Ctrl + Alt + ...

随机推荐

  1. 【Flutter学习】之Widget数据共享之InheritedWidget

    一,概述 业务开发中经常会碰到这样的情况,多个Widget需要同步同一份全局数据,比如点赞数.评论数.夜间模式等等.在安卓中,一般的实现方式是观察者模式,需要开发者自行实现并维护观察者的列表.在flu ...

  2. 【dart学习】-- Dart之异步编程

    一,概述 编程中的代码执行,通常分为同步与异步两种. 同步:简单说,同步就是按照代码的编写顺序,从上到下依次执行,这也是最简单的我们最常接触的一种形式.但是同步代码的缺点也显而易见,如果其中某一行或几 ...

  3. winform 控件拖拽和缩放

    核心类: using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using ...

  4. (59)C# IIS Express 设置

    支持非localhost访问 本地测试时 修改 localhost改成127.0.0.1

  5. ubuntu+VS code+launch.json+task.json

    1.ubuntu->vs code . 通过官方PPA安装Ubuntu make sudo add-apt-repository ppa:ubuntu-desktop/ubuntu-make s ...

  6. processing模拟三角级数合成方波过程

    代码 1: int radius = 2; 2: int[] accumys; 3: int times = 0; 4: 5: float scale = 1; 6: int origin = 400 ...

  7. Leetcode代码复盘_分治法相关

    分治法 1.二分搜索(算法时间复杂度O(log n)) 输出:如果x=A[j],则输出j,否则输出0. 1.binarysearch(1,n) 过程:binarysearch(low,high) 1. ...

  8. windows配置环境变量

    windows配置环境变量 1.第一步 2.第二步 3.第三步

  9. promise的基本用法

    // Promise 对象,可以保存状态 //Promise 第一步 // 异步代码 写在 Promise的函数中 第二步 const promise = new Promise((resolve, ...

  10. Python 常见报错类型

    一.TypeError:类型错误,对象用来表示值的类型非预期类型时发生的错误 错误例子: age=18 print(‘我的年龄是’+age) 报错信息:TypeError: can only conc ...