zoukankan      html  css  js  c++  java
  • Linux相关代码

    Linux

     ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----

      文件管理:

      实现COW(copy_on_write:也就是windows下所谓的复制、粘贴):

      

     1 #include <sys/types.h>
     2 #include <sys/stat.h>
     3 #include <fcntl.h>
     4 #include <unistd.h>
     5 
     6 int main(){
     7         int file = open("test.txt", O_RDONLY);
     8 
     9         //打开文件
    10         if(file == -1){
    11                 perror("打开失败");
    12                 return 1;
    13         }
    14         int new_file = open("love.txt", O_CREAT|O_WRONLY, 0777);
    15         if(new_file == -1){
    16                 perror("打开失败");
    17                 return 1;
    18         }
    19         int buff[1024] = {0};
    20         int count = 0;
    21 
    22         count = read(file, buff, 1024);
    23         if(count == -1){
    24                 perror("读取失败");
    25                 return 1;
    26         }
    27         while(count){
    28                 write(new_file, buff, count);
    29                 count = read(file, buff, count);
    30         }
    31         //关闭文件
    32         close(file);
    33         close(new_file);
    34         return 0;
    35 }
    COW

      

     ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----

       进程管理:

    #include <linux/init.h>
    #include <linux/module.h>
    #include<linux/kernel.h>
    extern int my_print(int n);
    static int hello_init(void)
    {
    my_print(10);
    return 0;
    }
    static void hello_exit(void)
    {
    printk(KERN_ALERT "Hello World exit ");
    }
    module_init(hello_init);
    module_exit(hello_exit);
    MODULE_AUTHOR("Song YanNa");
    MODULE_LICENSE("GPL");

    TARGET=m
    KUER=$(shell uname -r)
    KDIR=/lib/modules/$(KUER)/build
    PWD=$(shell pwd)
    obj-m +=$(TARGET).o
    default:
    make -C $(KDIR) M=$(PWD) modules

    #include <linux/module.h>
    #include <linux/blkdev.h>

    #define SIMP_BLKDEV_DISKNAME "simp_blkdev" //块设备名
    #define SIMP_BLKDEV_DEVICEMAJOR COMPAQ_SMART2_MAJOR //主设备号
    #define SIMP_BLKDEV_BYTES (50*1024*1024) // 块设备大小为50MB
    #define SECTOR_SIZE_SHIFT 9

    static struct gendisk *simp_blkdev_disk;// gendisk结构表示一个简单的磁盘设备
    static struct block_device_operations simp_blkdev_fops = { //块设备操作,gendisk的一个属性
    .owner = THIS_MODULE,
    };
    static struct request_queue *simp_blkdev_queue;//指向块设备请求队列的指针
    unsigned char simp_blkdev_data[SIMP_BLKDEV_BYTES];// 虚拟磁盘块设备的存储空间


    //磁盘块设备数据请求的处理函数
    static void simp_blkdev_do_request(struct request_queue *q){
    struct request *req;// 正在处理的请求队列中的请求
    struct bio *req_bio;// 当前请求的bio
    struct bio_vec *bvec;// 当前请求的bio的段(segment)链表
    char *disk_mem; // 需要读/写的磁盘区域
    char *buffer; // 磁盘块设备的请求在内存中的缓冲区
    int i = 0;

    while((req = blk_fetch_request(q)) != NULL){
    // 判断当前req是否合法
    if((blk_rq_pos(req)<<SECTOR_SIZE_SHIFT) + blk_rq_bytes(req) > SIMP_BLKDEV_BYTES){
    printk(KERN_ERR SIMP_BLKDEV_DISKNAME":bad request:block=%llu, count=%u ",(unsigned long long)blk_rq_pos(req),blk_rq_sectors(req));
    blk_end_request_all(req, -EIO);
    continue;
    }
    //获取需要操作的内存位置
    disk_mem = simp_blkdev_data + (blk_rq_pos(req) << SECTOR_SIZE_SHIFT);
    req_bio = req->bio;// 获取当前请求的bio

    switch (rq_data_dir(req)) { //判断请求的类型
    case READ:
    // 遍历req请求的bio链表
    while(req_bio != NULL){
    // for循环处理bio结构中的bio_vec结构体数组(bio_vec结构体数组代表一个完整的缓冲区)
    for(i=0; i<req_bio->bi_vcnt; i++){
    bvec = &(req_bio->bi_io_vec[i]);
    buffer = kmap(bvec->bv_page) + bvec->bv_offset;
    memcpy(buffer, disk_mem, bvec->bv_len);
    kunmap(bvec->bv_page);
    disk_mem += bvec->bv_len;
    }
    req_bio = req_bio->bi_next;
    }
    __blk_end_request_all(req, 0);
    break;
    case WRITE:
    while(req_bio != NULL){
    for(i=0; i<req_bio->bi_vcnt; i++){
    bvec = &(req_bio->bi_io_vec[i]);
    buffer = kmap(bvec->bv_page) + bvec->bv_offset;
    memcpy(disk_mem, buffer, bvec->bv_len);
    kunmap(bvec->bv_page);
    disk_mem += bvec->bv_len;
    }
    req_bio = req_bio->bi_next;
    }
    __blk_end_request_all(req, 0);
    break;
    default:
    /* No default because rq_data_dir(req) is 1 bit */
    break;
    }
    }
    }


    /******************************************************
    *
    * 模块的入口函数
    *
    ******************************************************/
    static int __init simp_blkdev_init(void){
    int ret;

    //1.添加设备之前,先申请设备的资源
    simp_blkdev_disk = alloc_disk(1);
    if(!simp_blkdev_disk){
    ret = -ENOMEM;
    goto err_alloc_disk;
    }

    //2.设置设备的有关属性(设备名,设备号,fops指针,请求队列,512B的扇区数)
    strcpy(simp_blkdev_disk->disk_name,SIMP_BLKDEV_DISKNAME);
    simp_blkdev_disk->major = SIMP_BLKDEV_DEVICEMAJOR;
    simp_blkdev_disk->first_minor = 0;
    simp_blkdev_disk->fops = &simp_blkdev_fops;
    // 将块设备请求处理函数的地址传入blk_init_queue函数,初始化一个请求队列
    simp_blkdev_queue = blk_init_queue(simp_blkdev_do_request, NULL);
    if(!simp_blkdev_queue){
    ret = -ENOMEM;
    goto err_init_queue;
    }
    simp_blkdev_disk->queue = simp_blkdev_queue;
    set_capacity(simp_blkdev_disk, SIMP_BLKDEV_BYTES>>9);

    //3.入口处添加磁盘块设备
    add_disk(simp_blkdev_disk);
    return 0;

    err_alloc_disk:
    return ret;
    err_init_queue:
    return ret;
    }


    /******************************************************
    *
    * 模块的出口函数
    *
    ******************************************************/
    static void __exit simp_blkdev_exit(void){
    del_gendisk(simp_blkdev_disk);// 释放磁盘块设备
    put_disk(simp_blkdev_disk); // 释放申请的设备资源
    blk_cleanup_queue(simp_blkdev_queue);// 清除请求队列
    }


    module_init(simp_blkdev_init);// 声明模块的入口
    module_exit(simp_blkdev_exit);// 声明模块的出口

    ifeq ($(KERNELRELEASE),)
    KDIR := /lib/modules/$(shell uname -r)/build
    PWD := $(shell pwd)
    modules:
    $(MAKE) -C $(KDIR) M=$(PWD) modules
    modules_install:
    $(MAKE) -C $(KDIR) M=$(PWD) modules_install
    clean:
    rm -rf *.o *.ko .depend *.mod.o *.mod.c Module.* modules.*
    .PHONY:modules modules_install clean
    else
    obj-m := block.o
    endif

  • 相关阅读:
    mysql的四种隔离
    mysql-事物
    Mysql数据备份
    线程池
    springboot整合log4j2
    springboot项目部署
    数组去重
    倒叙输出算法
    使用LLDB和debugserver对ios程序进行调试
    Linux使用pyinstaller 编译py成可执行程序
  • 原文地址:https://www.cnblogs.com/meditation5201314/p/10008424.html
Copyright © 2011-2022 走看看