女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux驅(qū)動(dòng)file_operations結(jié)構(gòu)體函數(shù)的作用

麥辣雞腿堡 ? 來(lái)源:嵌入式Linux系統(tǒng)開(kāi)發(fā) ? 作者:嵌入式Linux系統(tǒng)開(kāi) ? 2023-07-20 11:08 ? 次閱讀

寫(xiě)過(guò) Linux 驅(qū)動(dòng)的小伙伴,一定對(duì) file_operations 結(jié)構(gòu)體不陌生,我們常常實(shí)現(xiàn)其中的 open、read、write、poll 等函數(shù),今天為大家講解其中每個(gè)函數(shù)的作用。

1、struct module *owner;

這不是一個(gè)操作,它是一個(gè)指向擁有這個(gè)結(jié)構(gòu)的模塊的指針。用來(lái)在它的操作還在被使用時(shí)阻止模塊被卸載。一般情況下, 它被簡(jiǎn)單初始化為 THIS_MODULE, 一個(gè)在《linux/module.h》 中定義的宏。

2、loff_t (*llseek)

llseek 方法用作改變文件中的當(dāng)前【讀/寫(xiě)】位置, 并且新位置作為(正的)返回值。錯(cuò)誤返回負(fù)值。

3、ssize_t (*read)

從設(shè)備中同步讀取數(shù)據(jù),也就是讀節(jié)點(diǎn)。讀取成功返回讀取的字節(jié)數(shù)。

4、ssize_t (*write)

向設(shè)備同步發(fā)送數(shù)據(jù),也就是寫(xiě)節(jié)點(diǎn)。

5、ssize_t (*read_iter)

初始化一個(gè)異步讀??赡茉诤瘮?shù)返回前不結(jié)束的讀操作。如果這個(gè)方法是 NULL,所有的操作會(huì)由 read 代替進(jìn)行(同步)。

6、ssize_t (*write_iter)

初始化一個(gè)異步寫(xiě)。

7、int (*iterate)

迭代

8、int (*iterate_shared)

共享迭代

9、unsigned int (*poll)

poll 方法是 3 個(gè)系統(tǒng)調(diào)用的后端:poll, epoll, 和 select, 都用作查詢(xún)對(duì)一個(gè)或多個(gè)文件描述符的讀或?qū)懯欠駮?huì)阻塞。poll 方法應(yīng)當(dāng)返回一個(gè)位掩碼指示是否非阻塞的讀或?qū)懯强赡艿?,并且提供給內(nèi)核信息用來(lái)使調(diào)用進(jìn)程睡眠直到可以進(jìn)行讀寫(xiě)。如果一個(gè)驅(qū)動(dòng)的 poll 方法為 NULL,設(shè)備假定為不阻塞地可讀可寫(xiě)。

10、long (*unlocked_ioctl)

kernel-2.6 以前,使用的是 ioctl;kernel-2.6 以后,使用 unlocked_ioctl。

11、long (*compat_ioctl)

兼容性的 ioctl,為了讓 32-bit 的 process 可以在 64-bit 上的 system 來(lái)執(zhí)行 ioctl()

12、int (*mmap)

用來(lái)請(qǐng)求將設(shè)備內(nèi)存映射到進(jìn)程的地址空間。一般涉及到圖像方面,會(huì)使用此函數(shù),比如 framebuffer。如果這個(gè)方法是 NULL,mmap 系統(tǒng)調(diào)用返回 -ENODEV。

13、int (*open)

打開(kāi)文件,盡管這常常是對(duì)設(shè)備文件進(jìn)行的第一個(gè)操作,不要求驅(qū)動(dòng)聲明一個(gè)對(duì)應(yīng)的方法。如果這個(gè)項(xiàng)是 NULL,設(shè)備打開(kāi)一直成功,但是你的驅(qū)動(dòng)不會(huì)得到通知。

14、int (*flush)

flush 操作在進(jìn)程關(guān)閉它的設(shè)備文件描述符的拷貝時(shí)調(diào)用; 它應(yīng)當(dāng)執(zhí)行(并且等待)設(shè)備的任何未完成的操作。我們很少使用 flush,SCSI 磁帶驅(qū)動(dòng)使用它,為確保所有寫(xiě)的數(shù)據(jù)在設(shè)備關(guān)閉前寫(xiě)到磁帶上。如果 flush 為 NULL,內(nèi)核簡(jiǎn)單地忽略用戶應(yīng)用程序的請(qǐng)求。

15、int (*release)

在文件結(jié)構(gòu)被釋放時(shí)引用這個(gè)操作。

16、int (*fsync)

這個(gè)方法是 fsync 系統(tǒng)調(diào)用的后端, 用戶調(diào)用來(lái)刷新任何掛著的數(shù)據(jù)。 如果這個(gè)指針是 NULL, 系統(tǒng)調(diào)用返回 -EINVAL.

17、int (*fasync)

通知設(shè)備 FASYNC 標(biāo)志發(fā)生變化,如果設(shè)備不支持異步通知,該字段可以為NULL

18、int (*lock)

lock 方法用來(lái)實(shí)現(xiàn)文件加鎖; 加鎖對(duì)常規(guī)文件是必不可少的特性, 但是設(shè)備驅(qū)動(dòng)幾乎從不實(shí)現(xiàn)它。

19、ssize_t (*sendpage)

它由內(nèi)核調(diào)用來(lái)發(fā)送數(shù)據(jù), 一次一頁(yè),到對(duì)應(yīng)的文件。設(shè)備驅(qū)動(dòng)實(shí)際上不實(shí)現(xiàn) sendpage。

20、unsigned long (*get_unmapped_area)

這個(gè)方法的目的是在進(jìn)程的地址空間找一個(gè)合適的位置來(lái)映射在底層設(shè)備上的內(nèi)存段中。 這個(gè)任務(wù)通常由內(nèi)存管理代碼進(jìn)行; 這個(gè)方法存在為了使驅(qū)動(dòng)能強(qiáng)制特殊設(shè)備可能有的任何的對(duì)齊請(qǐng)求。 大部分驅(qū)動(dòng)可以置這個(gè)方法為 NULL。

21、int (*check_flags)

這個(gè)方法允許模塊檢查傳遞給 fnctl(F_SETFL.。.) 調(diào)用的標(biāo)志。

22、int (*flock)

為解決多進(jìn)程對(duì)同一文件的讀寫(xiě)沖突,在 Linux 系統(tǒng)中,提供了 flock 這一系統(tǒng)調(diào)用,用來(lái)實(shí)現(xiàn)對(duì)文件的讀寫(xiě)保護(hù),即文件鎖的功能。

23、ssize_t (*splice_write)

類(lèi)似于 write,splice 用于在兩個(gè)文件描述符之間移動(dòng)數(shù)據(jù),是一種重要零拷貝技術(shù)。

24、ssize_t (*splice_read)

類(lèi)似于 read,splice 用于在兩個(gè)文件描述符之間移動(dòng)數(shù)據(jù),是一種重要零拷貝技術(shù)。

25、int (*setlease)

設(shè)置租約?

26、long (*fallocate)

快速創(chuàng)建文件。

27、void (*show_fdinfo)

展示 fd 文件描述符的信息。

28、unsigned (*mmap_capabilities)

mmap 的權(quán)限限制信息。

29、ssize_t (*copy_file_range)

Copy a range of data from one file to another.

30、int (*clone_file_range)

將一系列的數(shù)據(jù)從一個(gè)文件復(fù)制到另一個(gè)文件,希望在這一過(guò)程中能以比較優(yōu)化的方式來(lái)完成。

31、ssize_t (*dedupe_file_range)

用于將文件一定范圍內(nèi)的重復(fù)數(shù)據(jù)消除。

一般情況下,大家只需要實(shí)現(xiàn)最常見(jiàn)幾個(gè)就可以,比如 llseek、open、read、write、poll 、unlocked_ioctl、mmap、flush 等。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 驅(qū)動(dòng)
    +關(guān)注

    關(guān)注

    12

    文章

    1900

    瀏覽量

    86538
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11465

    瀏覽量

    212817
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4371

    瀏覽量

    64220
收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    ArmSoM系列板卡 嵌入式Linux驅(qū)動(dòng)開(kāi)發(fā)實(shí)戰(zhàn)指南 之 字符設(shè)備驅(qū)動(dòng)

    的抽象,字符設(shè)備設(shè)計(jì)思路; 字符設(shè)備相關(guān)的概念以及數(shù)據(jù)結(jié)構(gòu),了解設(shè)備號(hào)等基本概念以及file_operations、file、inode相關(guān)數(shù)據(jù)結(jié)構(gòu); 字符字符設(shè)備
    的頭像 發(fā)表于 04-10 09:53 ?1337次閱讀
    ArmSoM系列板卡 嵌入式<b class='flag-5'>Linux</b><b class='flag-5'>驅(qū)動(dòng)</b>開(kāi)發(fā)實(shí)戰(zhàn)指南 之 字符設(shè)備<b class='flag-5'>驅(qū)動(dòng)</b>

    嵌入式Linux字符驅(qū)動(dòng)LED燈設(shè)計(jì)

    );MODULE_LICENSE("GPL");2)Linux字符IO驅(qū)動(dòng)設(shè)計(jì)步驟如下:1.定義描述字符IO設(shè)備的結(jié)構(gòu)Linux中,每個(gè)
    發(fā)表于 02-03 14:28

    編譯字符設(shè)備驅(qū)動(dòng)file_operations結(jié)構(gòu)問(wèn)題?

    file_operations tdd_fops = {read:read_test,open:open_test,release:release_test,};int init_module(void) { int
    發(fā)表于 03-31 09:13

    編譯字符設(shè)備驅(qū)動(dòng)file_operations結(jié)構(gòu)問(wèn)題?

    file_operations tdd_fops = {read:read_test,openpen_test,release:release_test,};int init_module(void
    發(fā)表于 03-31 09:30

    linux驅(qū)動(dòng)-Input輸入子系統(tǒng)

    file_operations結(jié)構(gòu)中的函數(shù)。在Input子系統(tǒng)中,這些步驟會(huì)分布到不同的層中,最后三個(gè)層通過(guò)一些聯(lián)系構(gòu)成了一個(gè)完整的驅(qū)動(dòng)
    發(fā)表于 05-21 00:05

    十一天學(xué)會(huì)Linux驅(qū)動(dòng)編程(第十天)

    。如上圖所示紅框中的函數(shù)“void cdev_init(struct cdev *, const struct file_operations *)”和結(jié)構(gòu)“cdev”。cdev_i
    發(fā)表于 01-22 22:24

    芯靈思Sinlinx A33實(shí)現(xiàn)linux led驅(qū)動(dòng)

    驅(qū)動(dòng)(和塊設(shè)備驅(qū)動(dòng)),注意這里并不是驅(qū)動(dòng)文件設(shè)備節(jié)點(diǎn)!4) Linux使用file_operations
    發(fā)表于 12-25 12:10

    帶大家走進(jìn)嵌入式Linux-arm驅(qū)動(dòng)開(kāi)發(fā)

    一、本文將會(huì)以最簡(jiǎn)單的LED驅(qū)動(dòng)程序帶大家走進(jìn)嵌入式Linux-arm驅(qū)動(dòng)開(kāi)發(fā),首先,來(lái)了解一下最簡(jiǎn)單的驅(qū)動(dòng)框架。1.首先struct file_o
    發(fā)表于 12-15 07:59

    file_operations函數(shù)詳解

    struct file_operations,struct module *owner; // 指向擁有該結(jié)構(gòu)的模塊的指針,避免正在操作時(shí)被卸載,一般為初始化為T(mén)HIS_MODULES
    發(fā)表于 06-16 11:30 ?5030次閱讀

    LCD的ARM編程方式,LCD Linux程序如何寫(xiě)入?

    目前還沒(méi)有討論的 file_operations 方法是 ioctl ()。用戶應(yīng)用程序使用 ioctrl 系統(tǒng)調(diào)用操作 LCD 硬件。fb_ops 結(jié)構(gòu)中定義的方法為這些操作提供支 持。注意
    發(fā)表于 05-25 14:48 ?1772次閱讀
    LCD的ARM編程方式,LCD <b class='flag-5'>Linux</b>程序如何寫(xiě)入?

    用戶與內(nèi)核空間數(shù)據(jù)交換的方式之一seq_file

    要想使用seq_file功能,開(kāi)發(fā)者需要包含頭文件linux/seq_file.h,并定義與設(shè)置一個(gè)seq_operations結(jié)構(gòu)(類(lèi)似于
    發(fā)表于 05-14 15:34 ?1637次閱讀

    深入剖析Linux文件系統(tǒng)的架構(gòu)

    函數(shù)都必須由底層派生出的實(shí)例實(shí)現(xiàn),使用成員函數(shù) file_operations。在linux里面的文件操作,底層都要實(shí)現(xiàn)file_operatio
    發(fā)表于 05-16 09:15 ?1160次閱讀
    深入剖析<b class='flag-5'>Linux</b>文件系統(tǒng)的架構(gòu)

    Linux內(nèi)核如何使用結(jié)構(gòu)函數(shù)指針?

    我將結(jié)合具體的Linux內(nèi)核驅(qū)動(dòng)框架代碼來(lái)展示Linux內(nèi)核如何使用結(jié)構(gòu)函數(shù)指針。
    的頭像 發(fā)表于 09-06 14:17 ?1319次閱讀
    <b class='flag-5'>Linux</b>內(nèi)核如何使用<b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>和<b class='flag-5'>函數(shù)</b>指針?

    Linux驅(qū)動(dòng)函數(shù)接口說(shuō)明

    *parent, void *data, const struct file_operations *fops); name :要?jiǎng)?chuàng)建的 /sys/kernel/debug 下的目錄名 parent
    的頭像 發(fā)表于 09-27 11:20 ?662次閱讀

    怎么編寫(xiě)Framebuffer驅(qū)動(dòng)程序

    Framebuffer 驅(qū)動(dòng)程序框架 分為上下兩層: fbmem.c:承上啟下 實(shí)現(xiàn)、注冊(cè) file_operations 結(jié)構(gòu) 把 APP 的調(diào)用向下轉(zhuǎn)發(fā)到
    的頭像 發(fā)表于 03-22 09:13 ?849次閱讀
    怎么編寫(xiě)Framebuffer<b class='flag-5'>驅(qū)動(dòng)</b>程序