proc_create和create_proc_entry的区别

本文详细对比了在Linux系统中用于创建/proc目录下条目的两个函数:proc_create与create_proc_entry。主要从参数传递、文件操作函数设置等方面进行解析,帮助开发者更好地理解和选择合适的函数来实现其需求。

proc_create和create_proc_entry的区别

proc_create和create_proc_entry的区别  

2011-04-08 18:04:27|  分类: linux学习 |  标签:proc_create  struct  proc_fops  const  test  |举报|字号 订阅

 
 
在看md代码初始化的时候,看到md注册/proc/mdstat用了
     proc_create("mdstat", S_IRUGO, NULL, &md_seq_fops);
而我之前写proc下东西的时候经常用create_proc_entry,故看看有什么区别。
 
1. create_proc_entry比proc_create多了一个赋值默认文件操作的动作
对于规则文件,
    dp->proc_fops = &proc_file_operations;

static const struct file_operations proc_file_operations = {
 .llseek  = proc_file_lseek,
 .read  = proc_file_read,
 .write  = proc_file_write,
};
2. 而proc_create是创建时要提供自己的文件操作函数的。
static inline struct proc_dir_entry *proc_create(const char *name, mode_t mode,
 struct proc_dir_entry *parent, const struct file_operations *proc_fops)
{
 return proc_create_data(name, mode, parent, proc_fops, NULL);
}
 
3. 当然以前我用create_proc_entry时候当创建成功时,其实也没有用默认的文件操作指针
    Test = create_proc_entry("TEST", 0666, NULL);
    if (Test) {
            Test->proc_fops = &Test_file_ops;
    }
 
static struct file_operations Test_file_ops = {
        .owner = THIS_MODULE,
        .open = Test_open,
        .read = seq_read,
        .llseek = seq_lseek,
        .release = seq_release
};
4. 对于md
static const struct file_operations md_seq_fops = {
 .owner  = THIS_MODULE,
 .open           = md_seq_open,
 .read           = seq_read,
 .llseek         = seq_lseek,
 .release = seq_release_private,
 .poll  = mdstat_poll,
};
 
只是md还多赋值了一个poll成员。
无本质差异。
 
特此记录。
posted @ 2016-03-03 16:12 心灵捕手 阅读( ...) 评论( ...)   编辑 收藏
int ilitek_create_sysfsnode(void) { int ret = 0; struct i2c_client *client = ilitek_data->client; ilitek_data->ilitek_func_kobj = kobject_create_and_add("touchscreen", NULL); if (ilitek_data->ilitek_func_kobj == NULL) { tp_log_err("kobject_create_and_add failed\n"); } else { ret = sysfs_create_group(ilitek_data->ilitek_func_kobj, ilitek_attribute_group); if (ret < 0) { tp_log_err("sysfs_create_group failed\n"); kobject_put(ilitek_data->ilitek_func_kobj); } } ret = sysfs_create_group(&client->dev.kobj, ilitek_attribute_group); if (ret < 0) { tp_log_err("sysfs_create_group failed\n"); kobject_put(&client->dev.kobj); } return ret; } int32_t ilitek_create_tool_node(void) { int32_t ret = 0; // allocate character device driver buffer ret = alloc_chrdev_region(&ilitek_dev.devno, 0, 1, "ilitek_file"); if (ret) { tp_log_err("can't allocate chrdev\n"); //return ret; } else { tp_log_info("register chrdev(%d, %d)\n", MAJOR(ilitek_dev.devno), MINOR(ilitek_dev.devno)); // initialize character device driver cdev_init(&ilitek_dev.cdev, &ilitek_fops); ilitek_dev.cdev.owner = THIS_MODULE; ret = cdev_add(&ilitek_dev.cdev, ilitek_dev.devno, 1); if (ret < 0) { tp_log_err("add character device error, ret %d\n", ret); //return ret; } else { ilitek_dev.class = class_create(THIS_MODULE, "ilitek_file"); if (IS_ERR(ilitek_dev.class)) { tp_log_err("create class, error\n"); //return ret; } device_create(ilitek_dev.class, NULL, ilitek_dev.devno, NULL, "ilitek_ctrl"); } } ilitek_proc = proc_create("ilitek_ctrl", ILITEK_DEVICE_NODE_PERMISSON, NULL, &ilitek_fops); if (ilitek_proc == NULL) { tp_log_err("proc_create(ilitek_ctrl, ILITEK_DEVICE_NODE_PERMISSON, NULL, &ilitek_fops) fail\n"); } ilitek_proc_irq_enable = proc_create("ilitek_irq_enable", ILITEK_DEVICE_NODE_PERMISSON, NULL, &ilitek_irq_enable_fops); if (ilitek_proc_irq_enable == NULL) { tp_log_err("proc_create(ilitek_irq_enable, ILITEK_DEVICE_NODE_PERMISSON, NULL, &ilitek_irq_enable_fops) fail\n"); } #ifdef ILITEK_TUNING_NODE ilitek_proc_debug = proc_create("ilitek_debug", ILITEK_DEVICE_NODE_PERMISSON, NULL, &ilitek_debug_fops); if (ilitek_proc_debug == NULL) { tp_log_err("proc_create(ilitek_debug, ILITEK_DEVICE_NODE_PERMISSON, NULL, &ilitek_debug_fops) fail\n"); } ilitek_proc_debug_switch = proc_create("ilitek_debug_switch", ILITEK_DEVICE_NODE_PERMISSON, NULL, &ilitek_debug_fops_switch); if (ilitek_proc_debug_switch == NULL) { tp_log_err("proc_create(ilitek_debug, ILITEK_DEVICE_NODE_PERMISSON, NULL, &ilitek_debug_fops) fail\n"); } init_waitqueue_head(&(ilitek_data->inq)); ilitek_data->debug_data_frame = 0; #endif ilitek_sensortest_init(); ilitek_proc_entry = proc_mkdir("ilitek", NULL); if (!ilitek_proc_entry) { tp_log_err("Error, failed to creat procfs.\n"); } else { if (!proc_create("firmware_version", ILITEK_DEVICE_NODE_PERMISSON, ilitek_proc_entry, &ilitek_proc_fops_fwversion)) { tp_log_err("Error, failed to creat procfs firmware_version.\n"); remove_proc_entry("firmware_version", ilitek_proc_entry); } if (!proc_create("update_firmware", ILITEK_DEVICE_NODE_PERMISSON, ilitek_proc_entry, &ilitek_proc_fops_fwupdate)) { tp_log_err("Error, failed to creat procfs update_firmware.\n"); remove_proc_entry("update_firmware", ilitek_proc_entry); } if (!proc_create("sensor_test_data", ILITEK_DEVICE_NODE_PERMISSON, ilitek_proc_entry, &ilitek_proc_fops_sensortest)) { tp_log_err("Error, failed to creat procfs sensor_test.\n"); remove_proc_entry("sensor_test_data", ilitek_proc_entry); } if (!proc_create("noisefre_data", ILITEK_DEVICE_NODE_PERMISSON, ilitek_proc_entry, &ilitek_proc_fops_noisefre)) { tp_log_err("Error, failed to creat procfs noisefre_data.\n"); remove_proc_entry("noisefre_data", ilitek_proc_entry); } if (!proc_create("setmode_0", ILITEK_DEVICE_NODE_PERMISSON, ilitek_proc_entry, &ilitek_proc_fops_setmode_0)) { tp_log_err("Error, failed to creat procfs setmode_0.\n"); remove_proc_entry("setmode_0", ilitek_proc_entry); } if (!proc_create("setmode_1", ILITEK_DEVICE_NODE_PERMISSON, ilitek_proc_entry, &ilitek_proc_fops_setmode_1)) { tp_log_err("Error, failed to creat procfs setmode_1.\n"); remove_proc_entry("setmode_1", ilitek_proc_entry); } if (!proc_create("setmode_2", ILITEK_DEVICE_NODE_PERMISSON, ilitek_proc_entry, &ilitek_proc_fops_setmode_2)) { tp_log_err("Error, failed to creat procfs setmode_1.\n"); remove_proc_entry("setmode_2", ilitek_proc_entry); } } return 0; } 請問create node 的path?
07-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值