精华内容
下载资源
问答
  • PROC

    2015-12-11 15:05:33
    I.数据结构  proc_dir_entry struct proc_dir_entry { unsigned int low_ino; //inode号 unsigned short namelen; //文件名长度 const char *name;

    I.数据结构 

    proc_dir_entry

    
    struct proc_dir_entry {
    
    	unsigned int low_ino;	                  //inode号
    
    	unsigned short namelen;                   //文件名长度
    
    	const char *name;                         //文件名
    
    	mode_t mode;                              //文件权限值
    
    	nlink_t nlink;                            //子目录和软链接的数目
    
    	uid_t uid;				  //用户ID
    
    	gid_t gid;                                //组ID
    
    	loff_t size;
    
    	const struct inode_operations *proc_iops; //结点操作
    
    	const struct file_operations *proc_fops;  //文件操作
    
    	get_info_t *get_info;                     //get_info:用户向proc文件读取的数据小于一个页面大小时,可使用这个函数向用户返回数据。
    
    	struct module *owner;			  //拥有者
    
    	struct proc_dir_entry *next, *parent, *subdir;
    
    	void *data;                               //数据内容
    
    	read_proc_t *read_proc;			  //读接口 
    
    	write_proc_t *write_proc;		  //写接口
    
    	atomic_t count;  	                  // 引用计数
    
    	int deleted;                              //删除标志位
    
    	kdev_t rdev; 
    
    };
    

    proc inodes 

    union proc_op {     int (*proc_get_link)(struct inode *, struct dentry **,     struct vfsmount **);     int (*proc_read)(struct task_struct *task, char *page); }; struct proc_inode {     struct pid *pid;     int fd;     union proc_op op;     struct proc_dir_entry *pde;     struct inode vfs_inode; };

    注:在linux中可以使用container机制获取proc_inode结构,这是由一个函数完成的。

    static inline struct proc_inode *PROC_I(const struct inode *inode) {     return container_of(inode, struct proc_inode, vfs_inode); }

    II.PROC文件操作

    1.创建一个proc文件

    方法一:

    struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode, struct proc_dir_entry *parent)

    这是最直接,包装最少的创建方法。参数 name 是要创建的 proc 文件名。mode 是该文件权限值,例如 S_IRUGO,可传入0表示采用系统默认值。parent 指定该文件的上层 proc 目录项,如果为 NULL,表示创建在 /proc 根目录下。create_proc_entry() 完成的任务主要包括:检测 mode 值,分配 proc_dir_entry 结构,注册 proc_dir_entry。

    方法二:

    struct proc_dir_entry *proc_create(const char *name, mode_t mode, struct proc_dir_entry *parent, const struct file_operations *proc_fops)
    如果要创建一个 proc 文件,并且不用 proc_fs 默认提供的 file_operations 的话,可以使用 proc_create() 这个函数,通过最后一个参数来指定要创建的 proc 文件的 file_operations。
    每个 proc 文件也都会用到 file_operations,在调用 create_proc_entry() 创建 proc 文件时,其中一步是调用 proc_register(),proc_register() 会为 proc_dir_entry 提供一个默认的 file_operations,而 proc_create() 与 create_proc_entry() 唯一差别就是在调用 proc_register() 前先设置好 proc_dir_entry 的 file_operations,这样在 proc_register() 时就不会设置使用 proc_fs 默认的 file_operations 了。
    proc_fs 默认的 file_operations 定义如下:
    static const struct file_operations proc_file_operations = {
        .llseek        = proc_file_lseek,
        .read        = proc_file_read,
        .write        = proc_file_write,
    };

    2.创建一个proc目录
    
    创建一个 proc 目录就调用 struct proc_dir_entry *proc_mkdir(const char *name, struct proc_dir_entry *parent) 这个函数。参数name 是目录名,parent 是该目录的上层 proc 目录项,如果为 NULL,表示创建在 /proc 根目录下。
    
    
    3.删除一个proc文件或目录
    
    
    要删除一个 proc 文件或目录就调用 void remove_proc_entry(const char *name, struct proc_dir_entry *parent)
    注:proc 项创建时要避免已经存在同名的 proc 项,否则注册时内核会报错(但还是会成功返回那个 proc 项),在删除时有时会删不掉(尤其是 proc 目录)。删除一个 proc 目录会把这个目录所有的 proc 文件都删除。

    III.PROC读写操作

    读 proc 文件
    proc 文件的读需要自己提供一个 read_proc_t 类型的函数放在 proc_dir_entry 结构中供 proc_file_read() 函数调用。下面是 read_proc_t 类型函数的定义:
    typedef int (read_proc_t)(char *page, char **start, off_t off, int count, int *eof, void *data);
    这个函数的定义很复杂,不过当 proc 文件返回的数据量总是小于一个 PAGE_SIZE 时可以简化使用。

    写 proc 文件
    proc 文件的写很简单。如果是使用 proc_fs 默认提供的 file_operations 的话,要自己实现一个 write_proc_t 类型的函数放在 proc_dir_entry 结构中供 proc_file_write() 函数调用。write_proc_t 类型函数的定义如下:
    typedef int (write_proc_t)(struct file *file, const char __user *buffer, unsigned long count, void *data);
    下面是 proc_file_write() 的实现:
    static ssize_t proc_file_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)
    {
        struct inode *inode = file->f_path.dentry->d_inode;
        struct proc_dir_entry * dp;
        dp = PDE(inode);
        if (!dp->write_proc)
            return -EIO;
        return dp->write_proc(file, buffer, count, dp->data);
    }
    如果是使用自己提供的 file_operations 的话,那还是要自己实现一个 write 函数赋给 file_operations 的 .write 指针。

    IV.例子

    #include <linux/module.h>
    #include <linux/proc_fs.h>
    #include <asm/uaccess.h>

    static struct proc_dir_entry *mydir;
    static struct proc_dir_entry *pfile;

    static char msg[255];
    static int myproc_read(char *page, char **start, off_t off, int count, int *eof, void *data)
    {
            int len = strlen(msg);
            if (off >= len)
                    return 0;
            if (count > len - off)
                    count = len - off;
            memcpy(page + off, msg + off, count);
            return off + count;
    }
    static int myproc_write(struct file *file, const char __user *buffer, unsigned long count, void *data)
    {
            unsigned long count2 = count;
            if (count2 >= sizeof(msg))
                    count2 = sizeof(msg) - 1;
            if (copy_from_user(msg, buffer, count2))
                    return -EFAULT;
            msg[count2] = '/0';
            return count;
    }
    static int __init myproc_init(void)
    {
            mydir = proc_mkdir("mydir", NULL);
            if (!mydir) {
                    printk(KERN_ERR "Can't create /proc/mydir/n");
                    return -1;
            }
            pfile = create_proc_entry("pool", 0666, mydir);
            if (!pfile) {
                    printk(KERN_ERR "Can't create /proc/mydir/pool/n");
                    remove_proc_entry("mydir", NULL);
                    return -1;
            }
            pfile->read_proc = myproc_read;
            pfile->write_proc = myproc_write;
            return 0;
    }
    static void __exit myproc_exit(void)
    {
            remove_proc_entry("pool", mydir);
            remove_proc_entry("mydir", NULL);
    }

    module_init(myproc_init);
    module_exit(myproc_exit);

    
    
    
    
    
    

    展开全文
  • proc

    2012-10-06 11:14:24
    /proc 虚拟文件系统 用于内核向用户空间导出信息 ,是一种内核与用户新的通讯方法,对/proc的读写 即与内核交互 如/proc/meminfo 文件包含内存信息 /proc 由内核控制,没有承载 /proc 的设备。因为 /proc 主要存放...

    #include <linux/module.h>
    #include <linux/kernel.h>
    #include <linux/init.h>
    #include <linux/proc_fs.h>
    /proc 虚拟文件系统 用于内核向用户空间导出信息 ,是一种内核与用户新的通讯方法,对/proc的读写 即与内核交互 如/proc/meminfo 文件包含内存信息
    /proc 由内核控制,没有承载 /proc 的设备。因为 /proc 主要存放由内核控制的状态信息,所以大部分这些信息的逻辑位置位于内核控制的内存。对 /proc 进行一次
    'ls -l' 可以看到大部分文件都是 0 字节大的;不过察看这些文件的时候,确实可以看到一些信息。
    /proc/cpuinfo - CPU 的信息 (型号, 家族, 缓存大小等)
    /proc/meminfo - 物理内存、交换空间等的信息
    /proc/mounts - 已加载的文件系统的列表
    /proc/devices - 可用设备的列表
    /proc/filesystems - 被支持的文件系统
    /proc/modules - 已加载的模块
    /proc/version - 内核版本
    /proc/cmdline - 系统启动时输入的内核命令行参数
    内核中USB PCI 都会在/proc下导出内核信息
    MODULE_AUTHOR("Barry Song (author@linuxdriver.cn)");
    MODULE_DESCRIPTION("proc exmaple");
    MODULE_LICENSE("GPL");

    unsigned int variable;
    struct proc_dir_entry *test_dir, *test_entry;

    int test_proc_read(char *buf, char **start, off_t off, int count,
                             int *eof, void *data)
    { //start 用于返回实际写入到内存中的位置
     if(off>0)
     {
      *eof=1;
      return 0;
      }
          unsigned int       *ptr_var = data;
          int *p=0;
    *p=1;
          return sprintf(buf, "%u\n", *ptr_var);
    }

    int test_proc_write(struct file *file, const char *buffer,
     unsigned long count, void *data)
    {
     int count =MINLEN(max_ul_len,count);
     char k_buf[512];
     copy_from_user(k_buf,buffer,count);
     unsigned int      *ptr_var = data;
     
     printk(KERN_DEBUG "TEST: variable set to: %s", buffer);
     //内核空间的字符串转化为整数 函数
     *ptr_var = simple_strtoul(buffer, NULL, 10);
     
     return count;
    }

    int register_proc_files(void)
    {
     test_dir = proc_mkdir("test_dir", NULL);
     if (test_dir) {
      //创建节点  0644 可读写的节点 test_dir 为父节点
      test_entry = create_proc_entry("test_rw", 0644, test_dir);
      if (test_entry) {
       test_entry->nlink = 1;
       test_entry->owner =THIS_MODULE;
       test_entry->data = (void *) &variable;
       //指定读写函数指针
       test_entry->read_proc = test_proc_read;
       test_entry->write_proc = test_proc_write;
       return 0;
      }
     }

     return -ENOMEM;
    }

    void unregister_proc_files(void)
    {
     //删除/proc 下的节点
     remove_proc_entry("test_rw", test_dir);
     remove_proc_entry("test_dir", NULL);
    }

    int test_proc_init(void)
    {
     return register_proc_files();
    }

    void test_proc_cleanup(void)
    {
     unregister_proc_files();
    }

    module_init(test_proc_init);
    module_exit(test_proc_cleanup);
    最后 使用 insmod 命令加载模块
    cat 读取写入到其中的值
    使用 echo xxx > /proc/test_rw 写入数据

    展开全文
  • proc_create_data函数就是可以替换掉它,本文主要讲解下如何使用proc_create_data,以及相关的参数配置。 proc_create_data函数 函数定义在“linux/proc_fs.h”头文件中 extern struct proc_dir_entry *proc_...

    前情提要:

    移植代码的时候遇到create_proc_read_entry函数,新的内核里已经没有这个函数了,只能找对应的替换。

    proc_create_data函数就是可以替换掉它,本文主要讲解下如何使用proc_create_data,以及相关的参数配置。


    proc_create_data函数

    函数定义在“linux/proc_fs.h”头文件中

    extern struct proc_dir_entry *proc_create_data(const char *, umode_t,
    					       struct proc_dir_entry *,
    					       const struct file_operations *,
    					       void *);

    对应的实现在“fs/proc/generic.c”文件中

    struct proc_dir_entry *proc_create_data(const char *name, umode_t mode,
    					struct proc_dir_entry *parent,
    					const struct file_operations *proc_fops,
    					void *data)
    {
    	struct proc_dir_entry *pde;
    	if ((mode & S_IFMT) == 0)
    		mode |= S_IFREG;
    
    	if (!S_ISREG(mode)) {
    		WARN_ON(1);	/* use proc_mkdir() */
    		return NULL;
    	}
    
    	if ((mode & S_IALLUGO) == 0)
    		mode |= S_IRUGO;
    	pde = __proc_create(&parent, name, mode, 1);
    	if (!pde)
    		goto out;
    	pde->proc_fops = proc_fops;
    	pde->data = data;
    	if (proc_register(parent, pde) < 0)
    		goto out_free;
    	return pde;
    out_free:
    	kfree(pde);
    out:
    	return NULL;
    }
    EXPORT_SYMBOL(proc_create_data);

    proc_create_data的参数解析:

    • const char *name: //name为传递想要创建的/proc下的文件名
    • umode_t mode: //mode为建立的文件所拥有的读写等权限
    • struct proc_dir_entry *parent: //parent为你要在哪个文件夹下建立名字为name的文件,如:init_net.proc_net是要在/proc/net/下建立文件
    • const struct file_operations *proc_fops: //proc_fops为struct file_operations *指针(重点)
    • void *data //data保存似有数据的指针,如不要为NULL

    其中比较重要的是proc_fops参数,对应的是一连串的file_operations,不需要全部填满,根据需求写,给个参考:

    static const struct file_operations lm75_proc_fops = {
            .open      = lm75_proc_open,
            .read      = seq_read,
            .llseek    = seq_lseek,
            .release   = single_release,
    };

    对应的只需要将open实现一下,其他的都可以照搬

    static int lm75_proc_open(struct inode *inode, struct file *file)
    {
            return single_open(file, lm75_proc_show, NULL);
    }

    lm75_proc_open函数内的lm75_proc_show再去写对应的具体操作,就可以替换掉老版本的create_proc_read_entry了。


    完整实例

    放一个完整版的,如何在代码中添加proc_create_data函数,做一个参考:

    /*create_proc_read_entry isn't existed in the later 3.10.0*/
     #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0)
    
    static int lm75_read_proc(char *buf, char **start, off_t off,
                              int count, int *eof, void *data)
    {
    	u32 dev_id = (u32)data;
    ...
    	return len;
    }
    
    #else
    
    static int lm75_proc_show(struct seq_file *seq, void *v)
    {
    	u32 dev_id = (u32)((uintptr_t) seq->private);
    ...
    	return 0;
    }
    
    static int lm75_proc_open(struct inode *inode, struct file *file)
    {
            return single_open(file, lm75_proc_show, NULL);
    }
    
    static const struct file_operations lm75_proc_fops = {
            .open      = lm75_proc_open,
            .read      = seq_read,
            .llseek    = seq_lseek,
            .release   = single_release,
    };
    #endif /*end LINUX_VERSION_CODE <= KERNEL_VERSION(3, 10, 0)*/
    
    #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0)
    	create_proc_read_entry(str, S_IFREG | S_IRUGO, NULL,
    	                       lm75_read_proc, (void *)dev_id);
    #else
    	devp->procent = proc_create_data(str, S_IRUGO | S_IWUSR, NULL, \
    	                          &lm75_proc_fops, (void *)((uintptr_t)dev_id));
    	if (devp->procent == NULL) {
    		printk("proc_create failure: %s\n", str);
    		return -1;
    	}
    #endif

    再给一个别人的例子,作为参考:主要讲使用proc_create_data如何传递私有数据

    展开全文
  • PROC SUMMARY

    2020-09-03 10:27:09
    PROC SUMMARY data=<源数据集名> nway missing; class <变量名>; var <变量名>; output out=<数据集名> sum()= max()= min()= mean()= ; run; PROC SUMMARY <option(s)> <...

    其一般形式是:
    PROC SUMMARY data=<源数据集名> nway missing;
    class <变量名>;
    var <变量名>;
    output out=<数据集名> sum()= max()= min()= mean()= ;
    run;

    PROC SUMMARY <option(s)> <statistic-keyword(s)>;
    BY  variable-1<… variable-n>
    ;
    CLASS variable(s) </ option(s)>;
    FREQ variable;
    ID variable(s);
    OUTPUT <OUT=SAS-data-set><output-statistic-specification(s)>
    <id-group-specification(s)> <maximum-id-specification(s)>
    <minimum-id-specification(s)></ option(s)> ;
    TYPES request(s);
    VAR variable(s)</ WEIGHT=weight-variable>;
    WAYS list;
    WEIGHT variable;

    展开全文
  • linux proc

    2015-09-10 17:44:14
    linux proc
  • /proc

    千次阅读 2019-09-10 16:18:04
    /proc包含很多目录,其中以进程ID命名的目录代表就是那个进程。这些目录下众多文件包含了进程的信息和统计信息,由内核数据映射而来。 limits:实际的资源限制 maps:映射的内存区域 sched:CPU调度的各种统计 ...
  • Proc freq

    千次阅读 2019-05-06 23:30:35
    用于计数单个类别或者多个类别的。统计中的n*n列联表。HELP 文档:produces one-way to n-way frequency tables... PROC.FREQ can compute chi-square tests for one-way to n-way tables; for tests and measures o...
  • Proc datasets

    2017-08-10 16:00:00
    作用:控制数据集。...proc datasets lib=work; quit; 用法:  1. 更改数据集  proc datasets lib=work modify dataset_old rename var_old=var_new; ×× 给旧数据集中的变量重命名; ...
  • mount -t proc none /proc

    千次阅读 2016-04-11 00:14:58
    就是把proc这个虚拟文件系统挂载到/proc目录,应该initrd也是一个系统,只是不完整,而它做的工作需要用到/proc,否则不能工作 这种写法很让人误会 如果是initrd中,应该写为 mount -t proc proc /proc 第二个...
  • proc函数

    2015-09-15 08:37:52
    struct proc_dir_entry *proc_mkdir(const char *name, struct proc_dir_entry *parent); 类似于mkdir()函数,name是目录名,如“example_dir”,parent是要创建的目录的父目录名(若parent = NULL则创建在/proc...
  • proc_mkdir与proc_create

    千次阅读 2016-05-09 22:13:09
    1:创建proc文件夹 struct proc_dir_entry *proc_mkdir(const char *name, struct proc_dir_entry *parent); 参数1:name就是要创建的文件夹名称。 参数2:parent是要创建节点的父节点。也就是要在哪个文件夹之下...
  • 使用proc_create创建proc文件

    千次阅读 2016-03-09 11:54:46
    下面这个例子是使用seq_file接口实现可读写proc文件的例子,适用于3.10以后的内核,这和之前创建proc文件的函数实现上有很大差别,3.10以前的内核调用create_proc_entry,3.10以后的内核调用proc_create。...
  • proc文件的简单读写

    万次阅读 2020-11-25 18:12:18
    在开发模块功能时,需要用到一些调试或者传值给模块的方法,最简单的就是构造一个proc文件,然后配置传值或查看 。 如下提供了一个简单模板,需要时可以直接复制过去使用。 /* Init a test proc file 'btn_test'*...
  • PROC SORT

    2016-12-27 21:05:00
    PROC SORT DATA=输入数据集 <OUT=输出数据集><选项>; BY 关键变量; RUN; PROC SORT 语法如上,其中在尖括号中的可以不出现,也不会报错。 选项中常用的有两种NODUPKEY和NOUNIQUEKEY。 功能可以...
  • 在 Linux 系统中,可用如下函数创建/proc 节点:struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode, struct proc_dir_entry *parent);struct proc_dir_entry *create_proc_read_entry(const ...
  • http://blog.chinaunix.net/uid-10449864-id-2956854.html原来对linux系统中的/proc目录不是很了解,只知道可以查看cpu...转载如下:Linux中/proc目录下文件详解(一)/proc文件系统下的多种文件提供的系统信息不是...
  • /proc/irq和/proc/interrupts详解

    万次阅读 2018-12-17 15:45:35
    在/proc目录下面,有两个与中断子系统相关的文件和子目录,它们是: /proc/interrupts:文件 /proc/irq:子目录 读取interrupts会依次显示irq编号,每个cpu对该irq的处理次数,中断控制器的名字,irq的名字,以及...
  • 创建proc节点之create_proc_entry

    千次阅读 2017-12-05 11:13:34
    proc虚拟文件系统也可以创建节点,实现用户空间与内核空间的交互。在驱动中创建节点,可以实现对硬件的控制。 struct proc_dir_entry *create_proc_entry (const char *name, mode_t mode, struct proc_dir_entry *...
  • proc 编程

    2014-02-14 15:56:37
    proc编程  与sysfs虚拟文件系统相比,proc的使用没有sysfs那么组织严谨,更加随意,因此在内核模块中用proc文件系统与用户空间进行信息交互还是很方便的。  在内核模块中使用proc,需要包含头文件  其中...
  • ojbk的sas proc 过程之proc format

    千次阅读 2018-08-06 14:21:18
    sas数据输出输入格式很多,但有时候变量的输入输出格式想根据自己的要求来,这时候用proc format就好了; 例子: 创建数据集名称为a: data a; input id$ sex height weight band$; cards; cnw1r01 2 154 49 C ...
  • Linux proc_mkdir和proc_create的用法

    千次阅读 2018-01-19 15:21:00
    //功能:在proc中创建一个文件夹 //参数1:创建的文件夹名称 //参数2:创建的文件夹路径,就是在哪个文件夹中创建,如果是proc根目录,此参数为NULL //返回值:创建的文件夹路径 struct proc_dir_entry *proc_...
  • proc transpose

    千次阅读 2015-06-09 18:00:16
     data a; input x$ y$ z @@; cards; a x 10 b y 10 c z 15 a y 11 b z 12 c x 13 a z 14 b x 19 ...proc sort data = a out = b;...proc transpose data = b out = c let prefix = a; id y; by x; run;
  • 描述性统计过程PROC MEANS 和PROC FREQ

    千次阅读 2020-06-09 20:48:39
    PROC MEANS <options><statistic-keywords>; 一、options: data=data-set maxdec=n 指定输出结果的小数位数,默认为 7 位12 noprint:禁止结果在 OTPUT 窗口输出 alpha:设定可信区间的α...
  • PROC PRINT过程

    千次阅读 2020-06-07 17:14:06
    PROC PRINT过程主要用于打印数据,基本格式: PROC PRINT <options>; <statements> RUN; 常用option: 1、DATA=data-set; 指定该过程所使用的数据集。默认为最新创建的数据集。 2、NOOBS 不...
  • linux proc目录详解

    万次阅读 2019-03-19 08:14:08
    linux proc目录详解 Linux系统上的/proc目录是一种文件系统,即proc文件系统。与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以...
  • SAS PROC SQL

    千次阅读 2019-01-29 18:03:20
    过程PROC SQL用于处理SQL语句。此过程不仅可以返回SQL查询的结果,还可以创建SAS表和变量。所有这些情况的示例如下所述。 语法 在SAS中使用PROC SQL的基本语法是: PROC SQL ; SELECT Columns FROM TABLE WHERE ...
  • proc参数介绍

    2019-02-13 20:18:48
    Linux 系统上的/proc 目录是一种文件系统,即 proc 文件系统。与其它常见的文件系统不同的是,/proc 是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看...
  • PROC REPORT过程

    千次阅读 2020-06-09 00:46:07
    基本的语法格式: PROC REPORT <DATA=data-set> <options>; RUN;
  • proc目录

    2013-07-26 16:37:52
    Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 82,505
精华内容 33,002
关键字:

proc