精华内容
下载资源
问答
  • Linux2.4打开一个文件的系统调用

    千次阅读 2012-05-21 09:49:28
    (1)从当前进程的“打开文件表”中找到一个空闲的项get_unused_fs() (2)建立文件读写的上下文filp_open():(见1) (3)将上下文安装到文件打开表中 1.filp_open():建立文件读写的上下文 (1)获取指向...

    0.sys_open()

    (1)从当前进程的“打开文件表”中找到一个空闲的项get_unused_fs()

    (2)建立文件读写的上下文filp_open():(见1)

    (3)将上下文安装到文件打开表中


    1.filp_open():建立文件读写的上下文

    (1)获取指向文件名的dentry和vfsmount:open_namei()

    若只是打开,则通过path_init()和path_walk()搜索

    若有不存在就创建的要求,则(见3)


    3.获取指向文件名的dentry和vfsmount,若不存在就创建

    (1)找到path_name对应的节点的父dentry

    (2)找到目标文件的dentry

    (3)若不存在,则创建dentry:vfs_create()(见4)

    (4)判断dentry:

    若是一个安装点,则进入所安装的文件系统

    若是一个连接符号,则展开目标结点,go to 3-(1)

    (5)由dentry计算出inode

    (6)对inode各种检查

    (7)如果需要,对文件截尾

    A.切除length之后的内容

    B.修改inode

    C.把inode挂入脏队列


    4.vfs_create():为文件在创建一个dentry

    (1)创建文件在存储设备上的索引节点和内存中的inode:ext2_new_inode()

    (2)把目标文件的文件名和索引节点号写入其所在的目录ext2_add_entry()

    (3)把目标文件的dentry结构和inode结构联系在一起d_instantiate()

    展开全文
  • 文章目录文件系统目录与文件获取文件属性文件访问权限umask文件权限更改与管理粘住位文件系统实质硬链接 符号连接文件读写时间目录创建和销毁更改当前工作路径分析目录/读取目录内容系统数据文件和信息时间戳...

    文件系统


    目录与文件

    获取文件属性

    • stat
    • fstat
    • lstat
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/stat.h>
    #include <sys/types.h>
    #include <unistd.h>
    
    static off_t flen(const char *fname){
        struct stat statres;
        if (stat(fname,&statres) < 0) {
            perror("tata()");
            exit(1);
        }
        return statres.st_size;
    }
    
    int main(int argc,char **argv)
    {
        if (argc < 2) {
            fprintf(stderr,"Usage...\n");
            exit(1);
        }
    
        long len = flen(argv[1]);
        printf("st_size = %ld\n",len);
    
        exit(0);
    }
    
    

    注意,在unix中文件大小size只是一个属性,不一定代表文件真正的大小(与文件系统相关)

    #include <stdio.h>
    #include <sys/stat.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <fcntl.h>
    #include <errno.h>
    
    int main(int argc,char **argv)
    {
        if (argc < 2) {
            fprintf(stderr,"Usage...\n");
            exit(1);
        }
    
        int fd = open(argv[1],O_WRONLY|O_CREAT|O_TRUNC,0600);
        if (fd < 0) {
            perror("open()");
            exit(1);
        }
    
        long err = lseek(fd,5LL*1024LL*1024LL*1024LL-1LL,SEEK_SET);
        if (err == -1) {
            perror("lseek");
            exit(1);
        }
    
        write(fd,"",1);
    
        return 0;
    }
    
    

    文件访问权限

    • _ _ _ (7种文件类型) _ t(粘住位) _ g+s _ u+s _ _ _ user _ _ _ group _ _ _ other共15位用16位的位图表示
      7种文件类型 b c d - l s p 不错的-老色批
    • b 块设备文件
    • c 字符设备文件
    • d 目录
      • 常规文件
    • l 符号链接文件
    • s socket文件
    • p 匿名管道文件(不可见)
    
    //文件类型
    static int ftype(const char* fname) {
        if (stat(fname,&statres) < 0) {
            perror("rstat()");
            exit(1);
        }
        if (S_ISREG(statres.st_mode)) {
            return '-';
        }else if (S_ISDIR(statres.st_mode)) {
            return 'd';
        }else{
            return '?';
        }
    

    umask

    • 防止产生权限过松的文件

    文件权限的更改与管理

    • chmod (命令)
      • chmod a+x ??x ??x ??x
      • chmod u+x ??x ??? ???
      • chmod g+x ??? ??x ???
      • chmod o+x ??? ??? ??x
    • chmod()
    #include <sys/stat.h>
    int chmod(const char *path,mode_t mode);
    int fchmod(int fd,mode_t mode); //修改一个已经成功打开的文件
    
    

    粘住位

    • t位
    $ ls -l /
    drwxrwxrwt   1 root root 3.6K 2月   8 17:58 tmp
    

    文件系统的实质

    FAT UFS
    文件系统: 文件或数据的存储和管理
    在这里插入图片描述

    在这里插入图片描述

    硬链接 符号连接

    在这里插入图片描述

    • link (命令) 创建硬链接 其实就是在目录项中添加一条映射
    • ln() => ln
    • unlink() 删除一个文件的硬连接 但并不是删除文件 只有当一个文件的硬链接数为0 且没有进程占用该文件时一个文件才有被删除的可能(数据可被随意改写)

    文件读写时间

    • utime()

    目录的创建和销毁

    • mkdir ()
    • rmdir()

    更改当前工作路径

    • chdir => cd

    分析目录/读取目录内容

    单独调用

    • glob 解析模式/通配符
    //glob解析路径
    static void Glob(){
        glob_t globres;
        int err = glob(PAT,0,&errfunc,&globres);
        if (err) {
            printf("Error code = %d\n",err);
        }
    
        for (int i = 0;globres.gl_pathv[i]!= NULL;i++) {
            fprintf(stdout,"%s\n",globres.gl_pathv[i]);
        }
    }
    
    

    组合调用

    • opendir()
    • closedir()
    • readdir()
    • seekdir()
    • telldir()
    //组合解析路径
    static void PathParse(char *Path) {
        DIR *dp;
        struct dirent *cur;
    
        dp = opendir(Path);
        if (dp == NULL) {
              perror("opendir");
              exit(1);
        }
    
        while((cur = readdir(dp)) != NULL) {
            fprintf(stdout,"%s ",cur->d_name);
            fprintf(stdout,"type:%d ",cur->d_type);
        }
    
        closedir(dp);
    }
    
        //getcwd()的使用
        char pwd[1024];
        getcwd(pwd,1024);
        fprintf(stdout,"%s\n",pwd);
        PathParse(pwd);
    
    • 综合案例 mydu.c
    #include <stdint.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/stat.h>
    #include <sys/types.h>
    #include <glob.h>
    #include <string.h>
    
    #define PATHSIZE 1024
    
    static int path_noloop(const char *path) {
        char *pos;
        pos = strrchr(path,'/');
        if (pos == NULL) {
            exit(1);
        }
    
        if (strcmp(pos+1,".") == 0||strcmp(pos+1,"..")== 0) {
            return 0;
        }
        return 1;
    }
    
    static int64_t mydu(const char *path) {
        static struct stat statres;
        static char nextpath[PATHSIZE];
        glob_t globres;
        int64_t sum = 0;
    
        //非目录
        if (lstat(path,&statres) < 0) {
            perror("lstat()");
            exit(1);
        }
    
        if (!S_ISDIR(statres.st_mode)){
            fprintf(stdout,"%ld\t%s\n",statres.st_blocks / 2,path);
            return statres.st_blocks;
        }
        //目录
        //拼接路径
        strncpy(nextpath,path,PATHSIZE);
        strncat(nextpath,"/*",PATHSIZE);
        if (glob(nextpath,0,NULL,&globres) < 0) {
            fprintf(stderr,"glob()");
            exit(1);
        }
    
        strncpy(nextpath,path,PATHSIZE);
        strncat(nextpath,"/.*",PATHSIZE);
        if (glob(nextpath,GLOB_APPEND,NULL,&globres) < 0) {
            fprintf(stderr,"glob()");
            exit(1);
        }
    
        sum = statres.st_blocks;
        for (int i = 0;i < globres.gl_pathc;i++){
            if (path_noloop(globres.gl_pathv[i]))
                sum += mydu(globres.gl_pathv[i]);
        }
        
        globfree(&globres);//回收资源
        return sum;
            
    }
    
    int main(int argc,char **argv)
    {   
        if (argc < 2) {
            fprintf(stderr,"%s\n","Usage...");
            exit(1);
        }
        
        printf("%ld\t%s\n",mydu(argv[1])/2,argv[1]);
    
        return 0;
    }
    
    

    系统数据文件和信息

    在这里插入图片描述

    时间戳

    time_t => char * => struct_tm

    • time() 从kernel中取出时间戳(以秒为单位)
    • gntime() 将时间戳转换为struct_tm 格林威治时间
    • localtime() 将时间戳转换为struct_tm 本地时间
    • mktime() jaing struct_tm结构体转换为时间戳,还可以检查是否溢出
    • strftime(); 格式化时间字符串
    time_t stamp;
    time(&stamp);
    stamp = time(NULL);
    
    tm = localtime(&stamp);
    
    strftime(buf,BUFSIZE,"%Y-%m-%d",tm);
    puts(buf);
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <time.h>
    #include <string.h>
    
    #define BUFSIZE 1024
    
    int main()
    {
    
        char fmttime[BUFSIZ];
        int count = 0;
    
        FILE *fptr = fopen("./log","a+");
        if (fptr == NULL) {
            perror("fopen()");
            exit(1);
        }
    
        char buf[BUFSIZE];
    
        while(fgets(buf,BUFSIZE,fptr) != NULL){
            count++;
        }
    
        char res[BUFSIZE];
    
        while (1){
            time_t stamp;
            stamp = time(NULL);
    
            struct tm *struct_tm;
            struct_tm = localtime(&stamp);
    
            strftime(fmttime,BUFSIZE,"%Y-%m-%d %H:%M:%S",struct_tm);
            fprintf(fptr,"%d %s\n",++count,fmttime);
            fflush(fptr);
            sleep(1);
        }
    
        fclose(fptr);
    
        exit(0);
    }
    
    

    进程环境

    main函数

    • int main(int argc,char **argv)

    进程的终止

    • 正常终止
      • 从main函数返回
      • 调用exit
      • 调用_exit或者_Exit
      • 最后一个线程从其启动例程返回
      • 最后一个线程调用pthread_exit
    • 异常终止
      • 调用abort
      • 接到一个信号并终止
      • 最后一个线程对其取消请求作出响应

    命令行参数的分析

    环境变量

    本质就是 KEY = VALUE

    • export
    • getenv()
    • setenv()
    #include <stdio.h>
    #include <stdlib.h>
    
    extern char **environ;
    
    static void getEnv(char *key){
        puts(getenv(key));
    }
    
    int main()
    {
        
        for (int i = 0;environ[i] != NULL;i++){
            puts(environ[i]);
        }
        getEnv("ZSH");
        return 0;
    }
    

    C程序的存储空间布局

    在这里插入图片描述

    • pmap (1)

    #ifndef LLIST_H__
    #define LLIST_H__
    enum{
        F = 1,
        B = 2,
    };
    
    //普通节点
    struct llist_node_st{
        void *data;
        struct llist_node_st *prev;
        struct llist_node_st *next;
    };
    //头节点
    typedef struct {
        int size;
        struct llist_node_st head;
    } LLIST; //LLIST就是一个双向链表的头节点类型,对于链表的操作都是用head来进行的
    
    //传入 每个数据节点的数据类型大小
    LLIST *llist_careate(int size);
    //传入 一个已经创好的链表的头节点,插入的数据,插入的模式
    int llist_insert(LLIST *,const void *data,int mode);
    //传入
    void *llist_find(LLIST *head,const void* ,int (*func)(const void*,const void*));
    //
    int llist_delete(LLIST *head,const void* ,int (*func)(const void*,const void*));
    //
    int llist_fetch(LLIST *head,const void* ,int (*func)(const void*,const void*),void *);
    //传入 一个已经创建好的链表头节点
    void llist_travel(LLIST* head,void (*func)(const void*));
    void llist_destroy(LLIST *);
    
    #endif
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #include "llist.h"
    
    
    //传入 每个数据节点的数据类型大小
    LLIST *llist_careate(int size){
        LLIST *new;
        new = malloc(sizeof(*new));
        if (new == NULL){
            return NULL;
        }
    
        new->size = size;
        new->head.data = NULL;
        new->head.prev = &new->head;
        new->head.next = &new->head;
        
        return new;
    }
    //传入 一个已经创好的链表的头节点,插入的数据,插入的模式
    int llist_insert(LLIST *head,const void *data,int mode){
        struct llist_node_st *newnode;
        newnode = malloc(sizeof(*newnode));
        if (newnode == NULL)
          return -1;
    
        newnode->data = malloc(head->size);
        if (newnode->data == NULL){
            return -2;
        }
        memcpy(newnode->data,data,head->size);
    
        switch (mode) {
            case F:
                newnode->prev = &head->head;
                newnode->next = head->head.next;
                break;
            case B:
                newnode->prev = head->head.prev;
                newnode->next = &head->head;
                break;
            default:
                return -3;
        }
    
        newnode->prev->next = newnode;
        newnode->next->prev = newnode;
    
        return 0;
    
    }
    //传入 一个已经创建好的链表头节点,一个辅助遍历函数
    void llist_travel(LLIST* head,void (*func)(const void *)){
        struct llist_node_st *cur,*next;
        for (cur = head->head.next;cur != &head->head;cur = next) {
            func(cur->data);
            next = cur->next;
        }
    }
    
    //辅助函数
    static struct llist_node_st *find_(LLIST *head,const void *key,int (*func)(const void *,const void *)){
        struct llist_node_st *cur;
        for (cur = head->head.next;cur != &head->head;cur = cur->next){
            if (func(key,cur->data) == 0){
                return cur;
            }
        }
        return &head->head;
    }
    
    void *llist_find(LLIST *head,const void* key,int (*func)(const void*,const void*)){
        return find_(head,key,func)->data;
    }
    
    //
    int llist_delete(LLIST *head,const void* key,int (*func)(const void*,const void*)){
        struct llist_node_st *node;
        node = find_(head,key,func);
        if (node == &head->head){
            return -1;
        }else {
            node->prev->next = node->next;
            node->next->prev = node->prev;
            free(node->data);
            free(node);
            return 0;
        }
    }
    //
    int llist_fetch(LLIST *head,const void* key,int (*func)(const void*,const void*),void *data){
        struct llist_node_st *node;
        node = find_(head,key,func);
        if (node == &head->head){
            return -1;
        }else {
            node->prev->next = node->next;
            node->next->prev = node->prev;
            data = node->data;
            free(node->data);
            free(node);
            return 0;
        }
    }
    
    void llist_destroy(LLIST *head) {
        struct llist_node_st *cur,*next;
    
        for (cur = head->head.next;cur != &head->head;cur = next) {
            next = cur->next;
            free(cur->data);
            free(cur);
        }
        free(head);
    }
    
    CFLAGS		+=-Wall -g -lstdc++ -D_FILE_OFFSET_BITS=64
    CC			=gcc
    TARGET		=DoubleLinkList
    OBJ			=llist.o
    src  		=llist.c
    
    $(TARGET):$(OBJ)
    	$(CC) main.c $(OBJ) -o $@
    
    $(OBJ):$(src)
    	$(CC) $(src) $(CFLAGS) -c -o $@
    	
    clean:
    	-rm -f $(OBJ)
    	-rm -f $(TARGET)
    
    静态库
    • libxx.a xx指代库名
    • ar -cr libxx.a yyy.o
    • 发布到 /usr/local/include /usr/local/lib
    • 编译 gcc -L/usr/local/lib -o main mian.o -lxx -l参数必须在最后,有依赖
    make
    ar -cr libllist.a llist.o 
     gcc -L./ -o main main.c -lllist 
    
    动态库
    • libxx.so xx是库名
    • gcc -shared -fpic -o libxx.so yyy.c
    • 发布到 /usr/local/include /usr/local/lib (.h 与 .so)
    • /sbin/ldconfig 重读 /etc/ld.so.conf
    • gcc -I/usr/local/include -L/usr/local/lib -o ... lxx

    重名用动态库

    • 非root用户发布
      • sp xx.so ~/lib
      • export LD_LIBRARY_PATH=~/lib

    函数跳转

    适用场景: 在树结构中查找元素,找到后直接回到第一次调用处(跨函数),不用一层一层返回
    
    • setjmp()
    • longjmp()
    #include <stdio.h>
    #include <stdlib.h>
    #include <setjmp.h>
    
    static jmp_buf save;
    
    static void d(){
        printf("%s is called\n",__FUNCTION__);
        longjmp(save,2);
        printf("%s is returned\n",__FUNCTION__);
    }
    
    
    static void c(){
        printf("%s is called\n",__FUNCTION__);
        d();
        printf("%s is returned\n",__FUNCTION__);
    }
    
    
    static void b(){
        printf("%s is called\n",__FUNCTION__);
        c();
        printf("%s is returned\n",__FUNCTION__);
    }
    
    static void a(){
        int ret = setjmp(save);
        if  (ret == 0) {
            printf("%s is called\n",__FUNCTION__);
            b();
            printf("%s is returned\n",__FUNCTION__);
        }else {
            printf("code %d return \n",ret);
        }
    }
    
    int main()
    {
        a();
        return 0;
    }
    
    

    资源的获取与控制

    • getrlimit
    • setrlimit
    展开全文
  • ├day08-02 获取当前工作目录.mp4 ├day09-01 临时文件.mp4 ├day09-02 获取系统环境变量.mp4 ├day10_环境变量增、删、改、查.mp4 ├day11-01 创建屏蔽字.mp4 ├day11-02 知识小结.mp4 ├day12-01 dup文件描述符...
  • 系统相关实例50个

    2014-05-11 17:14:03
    得到当前进程的运行命令行信息 MB VIEW 存取注册表类 NT 性能统计类 磁盘引导区保存和恢复 asm 磁盘碎片整理程序源代码 NT下读写端口 磁盘空间监测器 vc++在操作系统应用大全 纯SDK编写记事本仿真程序 WIN ...
  • 1.抽象: 抽象就是忽略一个主题中与当前目标无关那些方面,以便更充分地注意与当前目标有关方面。抽象并不打算了解全部问题,而只是选择其中一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是...
  • PendMoves: 列出延迟到下次启动前执行的文件移动、删除操作 Portmon: 监视串/并口的数据活动支持所有标准的串并口 IOCTLs 甚至可以显示一部分交换的数据. Process Explorer: 能找出进程打开的文件,注册键,以及...
  • 生成一个名为test.php3的文件,含有以下内容: (); ?> 然后在你的浏览器中打开此文件。看看这个页面你就知道你的PHP安装使用的选项了。 2.3 语法 就像前面提到的一样,你可以混合编写你的PHP代码和HTML代码。因此...
  • Super-EC破解版

    2011-03-15 01:03:39
    ' 修改"内存操作类"在类创建后自动打开当前进程,如需操作当前进程,可以不使用"打开进程"命令就直接进行内存读写操作 ' 删除原有MD5类",增加新"MD5类" ' 增加"MD5类"中,"清空","加入数据","加入指针数据","取结果...
  • vc++ 应用源码包_1

    热门讨论 2012-09-15 14:22:12
    内含各种例子(vc下各种控件使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...
  • vc++ 应用源码包_2

    热门讨论 2012-09-15 14:27:40
    内含各种例子(vc下各种控件使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...
  • vc++ 应用源码包_6

    热门讨论 2012-09-15 14:59:46
    内含各种例子(vc下各种控件使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...
  • vc++ 应用源码包_5

    热门讨论 2012-09-15 14:45:16
    内含各种例子(vc下各种控件使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...
  • vc++ 应用源码包_4

    热门讨论 2012-09-15 14:38:35
    内含各种例子(vc下各种控件使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...
  • vc++ 应用源码包_3

    热门讨论 2012-09-15 14:33:15
    内含各种例子(vc下各种控件使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...
  • 1.2.7 请分析 MaxCompute 产品与分布式技术关系、当前大数据计算平台类产品市场现状和发展趋势 1.2.8 对大数据平台中元数据管理是怎么理解,元数据收集管理体系是怎么样,会对大数据应用有什么样影响 ...
  • FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...
  • vc++ 开发实例源码包

    2014-12-16 11:25:17
    详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64加解密、哈希加解密以及其它的文件加解密),分静态库和动态库方法。 JSCalls_demo js调用的演示源码 树控件拖动 演示了在树控件中来回拖动...
  • 操作系统(内存管理)

    热门讨论 2009-09-20 12:55:25
    要试着运行这些示例,需要先 复制本代码清单,并将其粘贴到一个名为 malloc.c 的文件中。接下来,我将一次一个部分地对该清单进行解释。 在大部分操作系统中,内存分配由以下两个简单的函数来处理: void *...
  • 要试着运行这些示例,需要先复制本代码清单,并将其粘贴到一个名为 malloc.c 的文件中。接下来,我将一次一个部分地对该清单进行解释。 在大部分操作系统中,内存分配由以下两个简单的函数来处理: void *...
  • Linux的文件系统 Vim编辑器的应用 环境变量和Shell编程 软件的安装和服务的配置 网络访问和管理 其他相关内容 Day36~40 - 数据库基础和进阶 关系型数据库MySQL 关系型数据库概述 MySQL的安装和使用 SQL的使用 ...
  • ISO:根据ISD 9660有关CD-ROM文件系统标准列出CD-ROM上的文件 ISP:X-Internet签字文件 IST:数字跟踪设备文件 ISU:InstallShield卸装脚本 IT:脉冲跟踪系统音乐模块(MOD)文件 ITI:脉冲跟踪系统设备 ITS:...
  • java开源包1

    千次下载 热门讨论 2013-06-28 09:14:34
    JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还...

空空如也

空空如也

1 2 3
收藏数 48
精华内容 19
关键字:

linux获取当前进程读写的文件

linux 订阅