日韩欧美自拍在线观看-欧美精品在线看片一区二区-高清性视频一区二区播放-欧美日韩女优制服另类-国产精品久久久久久av蜜臀-成人在线黄色av网站-肥臀熟妇一区二区三区-亚洲视频在线播放老色-在线成人激情自拍视频

用C語(yǔ)言編寫(xiě)的Linux應(yīng)用程序

出處:互聯(lián)網(wǎng) 發(fā)布于:2011-09-04 15:27:34

  1. “hello.c”

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

  /*

  ◆ 這是我們的個(gè)源文件,

  ◆ 它是一個(gè)可以加載的內(nèi)核模塊,

  ◆ 加載時(shí)顯示“Hello,World!”,

  ◆ 卸載時(shí)顯示“Bye!”。

  ◆ 需要說(shuō)明一點(diǎn),寫(xiě)內(nèi)核或內(nèi)核模塊不能用寫(xiě)應(yīng)用程序時(shí)的系統(tǒng)調(diào)用或函數(shù)庫(kù),

  ◆ 因?yàn)槲覀儗?xiě)的就是為應(yīng)用程序提供系統(tǒng)調(diào)用的代碼。

  ◆ 內(nèi)核有專用的函數(shù)庫(kù),如<linux/kernel.h>, <linux/fs.h>, <linux/sche.h>等,

  ◆ 現(xiàn)在還沒(méi)必要了解得很詳細(xì),

  ◆ 這里用到的printk的功能類似于printf。

  ◆ “/usr/src/linux”是你實(shí)際的內(nèi)核源碼目錄的一個(gè)符號(hào)鏈接,

  ◆ 如果沒(méi)有現(xiàn)在就創(chuàng)建一個(gè),因?yàn)橄旅婧鸵院蠖紩?huì)用到。

  ◆ 編譯它用“gcc -c -I/usr/src/linux/include hello.c”,

  ◆ 如果正常會(huì)生成文件hello.o,

  ◆ 加載它用“iNSmod hello.o”,

  ◆ 只有在文本終端下才能看到輸出。

  ◆ 卸載它用“rmmod hello”

  */

  /*

  ◆ 小技巧: 在用戶目錄的。bashrc里加上一行:

  ◆ alias mkmod=''gcc -c -I/usr/src/linux/include''

  ◆ 然后重新登陸Shell,

  ◆ 以后就可以用“mkmod hello.c”的方式來(lái)編譯內(nèi)核模塊了。

  */

  /* 開(kāi)始例行公事 */

  #ifndef __KERNEL__

  # define __KERNEL__

  #endif

  #ifndef MODULE

  # define MODULE

  #endif

  #include <linux/cONfig.h>

  #include <linux/module.h>

  MODULE_LICENSE(“GPL”);

  #ifdef CONFIG_SMP

  #define __SMP__

  #endif

  /* 結(jié)束例行公事 */

  #include <linux/kernel.h>

  static int

  init_module

  (){

  printk(“Hello,World!\n”);

  return 0;

  }

  static void

  cleanup_module

  (){

  printk(“Bye!\n”);

  }

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

  2. “asdf.c”

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

  /*

  ◆ 這個(gè)文件是一個(gè)內(nèi)核模塊。

  ◆ 內(nèi)核模塊的編譯,加載和卸載在前面已經(jīng)介紹了。

  ◆ 這個(gè)模塊的功能是,創(chuàng)建一個(gè)字符設(shè)備。

  ◆ 這個(gè)設(shè)備是一塊4096字節(jié)的共享內(nèi)存

  ◆ 內(nèi)核分配的主設(shè)備號(hào)會(huì)在加載模塊時(shí)顯示。

  */

  /* 開(kāi)始例行公事 */

  #ifndef __KERNEL__

  # define __KERNEL__

  #endif

  #ifndef MODULE

  # define MODULE

  #endif

  #include <linux/config.h>

  #include <linux/module.h>

  #ifdef CONFIG_SMP

  #define __SMP__

  #endif

  MODULE_LICENSE(“GPL”);

  /* 結(jié)束例行公事 */

  #include <asm/uaccess.h>

  #include <linux/fs.h>

  #include <linux/kernel.h>

  #include <linux/sched.h>

  #include <linux/types.h>

  /*

  ◆ 關(guān)于內(nèi)核功能庫(kù),可以去網(wǎng)上搜索詳細(xì)資料,

  */

  /* 文件被操作時(shí)的回調(diào)功能 */

  static int asdf_open (struct inode *inode, struct file *filp);

  static int asdf_release (struct inode *inode, struct file *filp);

  static ssize_t asdf_read (struct file *filp, char *buf, size_t count,loff_t *f_pos);

  static ssize_t asdf_write (struct file *filp, const char *buf, size_t count,loff_t *f_pos);

  static loff_t asdf_lseek (struct file *file, loff_t offset, int orig);

  /* 申請(qǐng)主設(shè)備號(hào)時(shí)用的結(jié)構(gòu), 在linux/fs.h里定義 */

  struct file_operations asdf_fops = {

  open: asdf_open,

  release: asdf_release,

  read: asdf_read,

  write: asdf_write,

  llseek: asdf_lseek,

  };

  static int asdf_major;

  static u8 asdf_body[4096]=“asdf_body\n”;

  static int

  init_module

  (){

  printk (“Hi, This'' A Simple Device File!\n”);

  asdf_major = register_chrdev (0, “A Simple Device File”, &asdf_fops);

  if (asdf_major < 0) return asdf_major;

  printk (“The major is:%d\n”, asdf_major);

  return 0;

  }

  static void

  cleanup_module

  (){

  unregister_chrdev(asdf_major, “A Simple Device File”);

  printk(“A Simple Device has been removed,Bye!\n”);

  }

  /*

  ◆ 編譯這個(gè)模塊然后加載它,

  ◆ 如果正常,會(huì)顯示你的設(shè)備的主設(shè)備號(hào)。

  ◆ 現(xiàn)在你的設(shè)備就建立好了,我們可以測(cè)試一下。

  ◆ 假設(shè)你的模塊申請(qǐng)到的主設(shè)備號(hào)是254,

  ◆ 運(yùn)行“mknod abc c 254 0”,就建立了我們的設(shè)備文件abc。

  ◆ 可以把它當(dāng)成一個(gè)4096字節(jié)的內(nèi)存塊來(lái)測(cè)試一下,

  ◆ 比如“cat abc”, “cp abc image”, “cp image abc”,

  ◆ 或?qū)憥讉€(gè)應(yīng)用程序用它來(lái)進(jìn)行通訊。

  ◆ 介紹一下兩個(gè)需要注意的事,

  ◆ 一是printk()的顯示只有在非圖形模式的終端下才能看到,

  ◆ 二是加載過(guò)的模塊在不用以后卸載掉。

  ◆ 如果對(duì)Linux環(huán)境的系統(tǒng)調(diào)用很陌生,建議先看APUE這本書(shū)。

  */

  static int

  asdf_open

  (

  struct inode *inode,

  struct file *filp

  ){

  printk(“^_^ : open %s\n ”,\

  current->comm);

  /*

  ◆ 應(yīng)用程序的運(yùn)行環(huán)境由內(nèi)核提供,內(nèi)核的運(yùn)行環(huán)境由硬件提供。

  ◆ 這里的current是一個(gè)指向當(dāng)前進(jìn)程的指針,

  ◆ 現(xiàn)在沒(méi)必要了解current的細(xì)節(jié)。

  ◆ 在這里,當(dāng)前進(jìn)程正打開(kāi)這個(gè)設(shè)備,

  ◆ 返回0表示打開(kāi)成功,內(nèi)核會(huì)給它一個(gè)文件描述符。

  ◆ 這里的comm是當(dāng)前進(jìn)程在Shell下的command字符串。

  */

  return 0;

  }

  static int

  asdf_release

  (

  struct inode *inode,

  struct file *filp

  ){

  printk(“^_^ : close\n ”);

  return 0;

  }

  static ssize_t

  asdf_read

  (

  struct file *filp,

  char *buf,

  size_t count,

  loff_t *f_pos

  ){

  loff_t pos;

  pos = *f_pos;

  if ((pos==4096) (count>4096)) return 0;

  pos += count;

  if (pos > 4096) {

  count -= (pos - 4096);

  pos = 4096;

  }

  if (copy_to_user(buf, asdf_body+*f_pos, count)) return -EFAULT;

  *f_pos = pos;

  return count;

  }

  static ssize_t

  asdf_write

  (

  struct file *filp,

  const char *buf,

  size_t count,

  loff_t *f_pos

  ){

  loff_t pos;

  pos = *f_pos;

  if ((pos==4096) (count>4096)) return 0;

  pos += count;

  if (pos > 4096) {

  count -= (pos - 4096);

  pos = 4096;

  }

  if (copy_from_user(asdf_body+*f_pos, buf, count)) return -EFAULT;

  *f_pos = pos;

  return count;

  }

  static loff_t

  asdf_lseek

  (

  struct file * file,

  loff_t offset,

  int orig

  ){

  loff_t pos;

  pos = file->f_pos;

  switch (orig) {

  case 0:

  pos = offset;

  break;

  case 1:

  pos += offset;

  break;

  case 2:

  pos = 4096+offset;

  break;

  default:

  return -EINVAL;

  }

  if ((pos>4096) (pos<0)) {

  printk(“^_^ : lseek error %d\n”,pos);

  return -EINVAL;

  }

  return file->f_pos = pos;

  }



  

版權(quán)與免責(zé)聲明

凡本網(wǎng)注明“出處:維庫(kù)電子市場(chǎng)網(wǎng)”的所有作品,版權(quán)均屬于維庫(kù)電子市場(chǎng)網(wǎng),轉(zhuǎn)載請(qǐng)必須注明維庫(kù)電子市場(chǎng)網(wǎng),http://hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。

本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載時(shí),必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。

如涉及作品內(nèi)容、版權(quán)等問(wèn)題,請(qǐng)?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。

廣告
OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機(jī)號(hào)碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線人工客服

買家服務(wù):
賣家服務(wù):
技術(shù)客服:

0571-85317607

網(wǎng)站技術(shù)支持

13606545031

客服在線時(shí)間周一至周五
9:00-17:30

關(guān)注官方微信號(hào),
第一時(shí)間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫(kù)提出的寶貴意見(jiàn),您的參與是維庫(kù)提升服務(wù)的動(dòng)力!意見(jiàn)一經(jīng)采納,將有感恩紅包奉上哦!