Notes for Advanced Linux Programming - 6. Devices

本文深入探讨了Linux中设备管理、文件系统结构与操作,包括设备类型、设备编号、设备创建与访问方法,以及特殊设备如null、zero、full等的作用。详细介绍了如何通过文件系统访问硬件设备,并通过实例展示了设备I/O操作与设备特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

6.  Devices

  • A device driver hides the hardware device’s communication protocols from the operating system and allows the system to interact with the device through a standardized interface.
  • Processes can communicate with a device driver via file-like objects.

6.1 Device Types

  • A character device represents a hardware device that reads or writes a serial stream of data bytes.
  • A block device represents a hardware device that reads or writes data in fixed-size blocks.

6.2 Device Numbers

  • Linux identifies devices using two numbers: the major device number and the minor device number.
  • The major device number specifies which driver the device corresponds to.
  • Minor device numbers distinguish individual devices or components controlled by a single driver.
  • The special entry /proc/devices lists major device numbers corresponding to active device drivers currently loaded into the kernel.

[liuchao@localhost ~]$ cat /proc/devices

Character devices:

  1 mem

  4 /dev/vc/0

  4 tty

  4 ttyS

  5 /dev/tty

  5 /dev/console

  5 /dev/ptmx

  6 lp

  7 vcs

 10 misc

 13 input

 14 sound

 21 sg

 29 fb

 99 ppdev

116 alsa

128 ptm

136 pts

180 usb

189 usb_device

216 rfcomm

254 pcmcia

 

Block devices:

  1 ramdisk

  1 ramdisk

  2 fd

  8 sd

  9 md

 22 ide1

 65 sd

 66 sd

 67 sd

 68 sd

 69 sd

 70 sd

 71 sd

128 sd

129 sd

130 sd

131 sd

132 sd

133 sd

134 sd

135 sd

253 device-mapper

254 mdp

 

6.3 Device Entries

  • Only superuser processes can create block and character devices using the mknod command or the mknod system call.
  • To create a device using the mknod command
  • The first argument is the path of the entry in the file system.
  • The second argument is b for a block device or c for a character device.
  • Provide the major and minor device numbers as the third and fourth arguments.

% mknod ./lp0 c 6 0

  • The ls command displays device entries specially.

% ls -l lp0

c(b for block device and c for character device)rw-r----- 1 root root 6, 0(major and minor device numbers) Mar 7 17:03 lp0

  • To remove the entry, use rm.

% rm ./lp0

  • The /dev Directory

[liuchao@localhost ~]$ ls -all /dev/

total 8

drwxr-xr-x 12 root    root       3840 Aug  2 13:22 .

drwxr-xr-x 24 root    root       4096 Aug  2 13:20 ..

crw-rw----  1 root    root    14,  12 Aug  2 13:20 adsp

crw-------  1 root    root    10, 175 Aug  2 13:20 agpgart

crw-------  1 liuchao root    14,   4 Aug  2 13:20 audio

drwxr-xr-x  3 root    root         60 Aug  2 13:20 bus

lrwxrwxrwx  1 root    root          3 Aug  2 13:20 cdrom -> hdc

lrwxrwxrwx  1 root    root          3 Aug  2 13:20 cdrom-hdc -> hdc

crw-------  1 liuchao root     5,   1 Aug  2 13:20 console

lrwxrwxrwx  1 root    root         11 Aug  2 13:20 core -> /proc/kcore

drwxr-xr-x  6 root    root        120 Aug  2 13:20 disk

brw-r-----  1 root    disk   253,   0 Aug  2  2008 dm-0

brw-r-----  1 root    disk   253,   1 Aug  2  2008 dm-1

crw-rw----  1 root    root    14,   9 Aug  2 13:20 dmmidi

crw-------  1 liuchao root    14,   3 Aug  2 13:20 dsp

lrwxrwxrwx  1 root    root         13 Aug  2 13:20 fd -> /proc/self/fd

brw-rw----  1 liuchao floppy   2,   0 Aug  2 13:20 fd0

brw-rw----  1 liuchao floppy   2,  84 Aug  2 13:20 fd0u1040

brw-rw----  1 liuchao floppy   2,  88 Aug  2 13:20 fd0u1120

brw-rw----  1 liuchao floppy   2,  28 Aug  2 13:20 fd0u1440

brw-rw----  1 liuchao floppy   2,  44 Aug  2 13:20 fd0u1680

brw-rw----  1 liuchao floppy   2,  60 Aug  2 13:20 fd0u1722

brw-rw----  1 liuchao floppy   2,  76 Aug  2 13:20 fd0u1743

brw-rw----  1 liuchao floppy   2,  96 Aug  2 13:20 fd0u1760

brw-rw----  1 liuchao floppy   2, 116 Aug  2 13:20 fd0u1840

brw-rw----  1 liuchao floppy   2, 100 Aug  2 13:20 fd0u1920

brw-rw----  1 liuchao floppy   2,  12 Aug  2 13:20 fd0u360

brw-rw----  1 liuchao floppy   2,  16 Aug  2 13:20 fd0u720

brw-rw----  1 liuchao floppy   2, 120 Aug  2 13:20 fd0u800

brw-rw----  1 liuchao floppy   2,  52 Aug  2 13:20 fd0u820

brw-rw----  1 liuchao floppy   2,  68 Aug  2 13:20 fd0u830

lrwxrwxrwx  1 root    root          3 Aug  2 13:20 floppy-fd0 -> fd0

crw-rw-rw-  1 root    root     1,   7 Aug  2 13:20 full

srwx------  1 liuchao root          0 Aug  2 13:21 gpmctl

brw-------  1 liuchao disk    22,   0 Aug  2 13:20 hdc

crw-------  1 root    root    10, 228 Aug  2 13:20 hpet

prw-------  1 root    root          0 Aug  2 13:22 initctl

drwxr-xr-x  2 root    root        120 Aug  2 13:20 input

crw-------  1 root    root     1,  11 Aug  2 13:20 kmsg

srw-rw-rw-  1 root    root          0 Aug  2 13:21 log

brw-r-----  1 root    disk     7,   0 Aug  2 13:20 loop0

brw-r-----  1 root    disk     7,   1 Aug  2 13:20 loop1

brw-r-----  1 root    disk     7,   2 Aug  2 13:20 loop2

brw-r-----  1 root    disk     7,   3 Aug  2 13:20 loop3

brw-r-----  1 root    disk     7,   4 Aug  2 13:20 loop4

brw-r-----  1 root    disk     7,   5 Aug  2 13:20 loop5

brw-r-----  1 root    disk     7,   6 Aug  2 13:20 loop6

brw-r-----  1 root    disk     7,   7 Aug  2 13:20 loop7

crw-rw----  1 root    lp       6,   0 Aug  2 13:20 lp0

lrwxrwxrwx  1 root    root         13 Aug  2 13:20 MAKEDEV -> /sbin/MAKEDEV

drwxr-xr-x  2 root    root        100 Aug  2  2008 mapper

brw-r-----  1 root    disk     9,   0 Aug  2 13:20 md0

crw-r-----  1 root    kmem     1,   1 Aug  2 13:20 mem

crw-------  1 liuchao root    14,   2 Aug  2 13:20 midi

crw-------  1 liuchao root    14,   0 Aug  2 13:20 mixer

drwxr-xr-x  2 root    root         60 Aug  2 13:20 net

crw-rw-rw-  1 root    root     1,   3 Aug  2 13:20 null

crw-rw----  1 root    root    10, 144 Aug  2 13:20 nvram

lrwxrwxrwx  1 root    root          3 Aug  2 13:20 par0 -> lp0

crw-rw----  1 root    lp      99,   0 Aug  2 13:20 parport0

crw-rw----  1 root    lp      99,   1 Aug  2 13:20 parport1

crw-rw----  1 root    lp      99,   2 Aug  2 13:20 parport2

crw-rw----  1 root    lp      99,   3 Aug  2 13:20 parport3

crw-r-----  1 root    kmem     1,   4 Aug  2 13:20 port

crw-------  1 root    root   108,   0 Aug  2 13:20 ppp

crw-rw-rw-  1 root    tty      5,   2 Aug  2 13:42 ptmx

drwxr-xr-x  2 root    root          0 Aug  2  2008 pts

lrwxrwxrwx  1 root    root          4 Aug  2 13:20 ram -> ram1

brw-r-----  1 root    disk     1,   0 Aug  2  2008 ram0

brw-r-----  1 root    disk     1,   1 Aug  2  2008 ram1

brw-r-----  1 root    disk     1,  10 Aug  2  2008 ram10

brw-r-----  1 root    disk     1,  11 Aug  2  2008 ram11

brw-r-----  1 root    disk     1,  12 Aug  2  2008 ram12

brw-r-----  1 root    disk     1,  13 Aug  2  2008 ram13

brw-r-----  1 root    disk     1,  14 Aug  2  2008 ram14

brw-r-----  1 root    disk     1,  15 Aug  2  2008 ram15

brw-r-----  1 root    disk     1,   2 Aug  2  2008 ram2

brw-r-----  1 root    disk     1,   3 Aug  2  2008 ram3

brw-r-----  1 root    disk     1,   4 Aug  2  2008 ram4

brw-r-----  1 root    disk     1,   5 Aug  2  2008 ram5

brw-r-----  1 root    disk     1,   6 Aug  2  2008 ram6

brw-r-----  1 root    disk     1,   7 Aug  2  2008 ram7

brw-r-----  1 root    disk     1,   8 Aug  2  2008 ram8

brw-r-----  1 root    disk     1,   9 Aug  2  2008 ram9

lrwxrwxrwx  1 root    root          4 Aug  2 13:20 ramdisk -> ram0

crw-rw-rw-  1 root    root     1,   8 Aug  2 13:20 random

brw-------  1 root    root   253,   0 Aug  2  2008 root

crw-r--r--  1 root    root    10, 135 Aug  2  2008 rtc

brw-r-----  1 root    disk     8,   0 Aug  2  2008 sda

brw-r-----  1 root    disk     8,   1 Aug  2 13:20 sda1

brw-r-----  1 root    disk     8,   2 Aug  2  2008 sda2

crw-------  1 liuchao root    14,   1 Aug  2 13:20 sequencer

crw-rw----  1 root    root    14,   8 Aug  2 13:20 sequencer2

crw-------  1 root    root    21,   0 Aug  2 13:20 sg0

drwxrwxrwt  2 root    root         40 Aug  2 13:20 shm

drwxr-xr-x  2 root    root        180 Aug  2 13:20 snd

lrwxrwxrwx  1 root    root         15 Aug  2 13:20 stderr -> /proc/self/fd/2

lrwxrwxrwx  1 root    root         15 Aug  2 13:20 stdin -> /proc/self/fd/0

lrwxrwxrwx  1 root    root         15 Aug  2 13:20 stdout -> /proc/self/fd/1

crw-------  1 root    root     4,   0 Aug  2  2008 systty

crw-rw-rw-  1 root    tty      5,   0 Aug  2 13:20 tty

crw-rw----  1 root    root     4,   0 Aug  2  2008 tty0

crw-------  1 root    root     4,   1 Aug  2 13:21 tty1

crw-rw----  1 root    tty      4,  10 Aug  2  2008 tty10

crw-rw----  1 root    tty      4,  11 Aug  2  2008 tty11

crw-rw----  1 root    tty      4,  12 Aug  2  2008 tty12

crw-rw----  1 root    tty      4,  13 Aug  2 13:20 tty13

crw-rw----  1 root    tty      4,  14 Aug  2 13:20 tty14

crw-rw----  1 root    tty      4,  15 Aug  2 13:20 tty15

crw-rw----  1 root    tty      4,  16 Aug  2 13:20 tty16

crw-rw----  1 root    tty      4,  17 Aug  2 13:20 tty17

crw-rw----  1 root    tty      4,  18 Aug  2 13:20 tty18

crw-rw----  1 root    tty      4,  19 Aug  2 13:20 tty19

crw-------  1 root    root     4,   2 Aug  2 13:21 tty2

crw-rw----  1 root    tty      4,  20 Aug  2 13:20 tty20

crw-rw----  1 root    tty      4,  21 Aug  2 13:20 tty21

crw-rw----  1 root    tty      4,  22 Aug  2 13:20 tty22

crw-rw----  1 root    tty      4,  23 Aug  2 13:20 tty23

crw-rw----  1 root    tty      4,  24 Aug  2 13:20 tty24

crw-rw----  1 root    tty      4,  25 Aug  2 13:20 tty25

crw-rw----  1 root    tty      4,  26 Aug  2 13:20 tty26

crw-rw----  1 root    tty      4,  27 Aug  2 13:20 tty27

crw-rw----  1 root    tty      4,  28 Aug  2 13:20 tty28

crw-rw----  1 root    tty      4,  29 Aug  2 13:20 tty29

crw-------  1 root    root     4,   3 Aug  2 13:21 tty3

crw-rw----  1 root    tty      4,  30 Aug  2 13:20 tty30

crw-rw----  1 root    tty      4,  31 Aug  2 13:20 tty31

crw-rw----  1 root    tty      4,  32 Aug  2 13:20 tty32

crw-rw----  1 root    tty      4,  33 Aug  2 13:20 tty33

crw-rw----  1 root    tty      4,  34 Aug  2 13:20 tty34

crw-rw----  1 root    tty      4,  35 Aug  2 13:20 tty35

crw-rw----  1 root    tty      4,  36 Aug  2 13:20 tty36

crw-rw----  1 root    tty      4,  37 Aug  2 13:20 tty37

crw-rw----  1 root    tty      4,  38 Aug  2 13:20 tty38

crw-rw----  1 root    tty      4,  39 Aug  2 13:20 tty39

crw-------  1 root    root     4,   4 Aug  2 13:21 tty4

crw-rw----  1 root    tty      4,  40 Aug  2 13:20 tty40

crw-rw----  1 root    tty      4,  41 Aug  2 13:20 tty41

crw-rw----  1 root    tty      4,  42 Aug  2 13:20 tty42

crw-rw----  1 root    tty      4,  43 Aug  2 13:20 tty43

crw-rw----  1 root    tty      4,  44 Aug  2 13:20 tty44

crw-rw----  1 root    tty      4,  45 Aug  2 13:20 tty45

crw-rw----  1 root    tty      4,  46 Aug  2 13:20 tty46

crw-rw----  1 root    tty      4,  47 Aug  2 13:20 tty47

crw-rw----  1 root    tty      4,  48 Aug  2 13:20 tty48

crw-rw----  1 root    tty      4,  49 Aug  2 13:20 tty49

crw-------  1 root    root     4,   5 Aug  2 13:21 tty5

crw-rw----  1 root    tty      4,  50 Aug  2 13:20 tty50

crw-rw----  1 root    tty      4,  51 Aug  2 13:20 tty51

crw-rw----  1 root    tty      4,  52 Aug  2 13:20 tty52

crw-rw----  1 root    tty      4,  53 Aug  2 13:20 tty53

crw-rw----  1 root    tty      4,  54 Aug  2 13:20 tty54

crw-rw----  1 root    tty      4,  55 Aug  2 13:20 tty55

crw-rw----  1 root    tty      4,  56 Aug  2 13:20 tty56

crw-rw----  1 root    tty      4,  57 Aug  2 13:20 tty57

crw-rw----  1 root    tty      4,  58 Aug  2 13:20 tty58

crw-rw----  1 root    tty      4,  59 Aug  2 13:20 tty59

crw-------  1 root    root     4,   6 Aug  2 13:21 tty6

crw-rw----  1 root    tty      4,  60 Aug  2 13:20 tty60

crw-rw----  1 root    tty      4,  61 Aug  2 13:20 tty61

crw-rw----  1 root    tty      4,  62 Aug  2 13:20 tty62

crw-rw----  1 root    tty      4,  63 Aug  2 13:20 tty63

crw-rw----  1 root    root     4,   7 Aug  2  2008 tty7

crw-rw----  1 root    root     4,   8 Aug  2 13:20 tty8

crw-rw----  1 root    tty      4,   9 Aug  2  2008 tty9

crw-rw----  1 root    uucp     4,  64 Aug  2  2008 ttyS0

crw-rw----  1 root    uucp     4,  65 Aug  2  2008 ttyS1

crw-rw----  1 root    uucp     4,  66 Aug  2  2008 ttyS2

crw-rw----  1 root    uucp     4,  67 Aug  2  2008 ttyS3

drwxr-xr-x  4 root    root         80 Aug  2 13:33 .udev

cr--r--r--  1 root    root     1,   9 Aug  2 13:20 urandom

crw-------  1 vcsa    tty      7,   0 Aug  2 13:20 vcs

crw-------  1 vcsa    tty      7,   1 Aug  2 13:21 vcs1

crw-------  1 vcsa    tty      7,   2 Aug  2 13:21 vcs2

crw-------  1 vcsa    tty      7,   3 Aug  2 13:21 vcs3

crw-------  1 vcsa    tty      7,   4 Aug  2 13:21 vcs4

crw-------  1 vcsa    tty      7,   5 Aug  2 13:21 vcs5

crw-------  1 vcsa    tty      7,   6 Aug  2 13:21 vcs6

crw-------  1 vcsa    tty      7,   7 Aug  2 13:22 vcs7

crw-------  1 vcsa    tty      7,   8 Aug  2 13:20 vcs8

crw-------  1 vcsa    tty      7, 128 Aug  2 13:20 vcsa

crw-------  1 vcsa    tty      7, 129 Aug  2 13:21 vcsa1

crw-------  1 vcsa    tty      7, 130 Aug  2 13:21 vcsa2

crw-------  1 vcsa    tty      7, 131 Aug  2 13:21 vcsa3

crw-------  1 vcsa    tty      7, 132 Aug  2 13:21 vcsa4

crw-------  1 vcsa    tty      7, 133 Aug  2 13:21 vcsa5

crw-------  1 vcsa    tty      7, 134 Aug  2 13:21 vcsa6

crw-------  1 vcsa    tty      7, 135 Aug  2 13:22 vcsa7

crw-------  1 vcsa    tty      7, 136 Aug  2 13:20 vcsa8

drwx------  2 root    root         80 Aug  2 13:20 VolGroup00

lrwxrwxrwx  1 root    root          4 Aug  2 13:20 X0R -> null

crw-rw-rw-  1 root    root     1,   5 Aug  2 13:20 zero

  • Accessing Devices by Opening Files

int fd = open (“/dev/lp0”, O_WRONLY);

write (fd, buffer, buffer_length);

close (fd);

6.4 Hardware Devices

  • Partial Listing of Common Block Devices

Device

Name

Major

Minor

First floppy drive

/dev/fd0

2

0

Second floppy drive

/dev/fd1

2

1

Primary IDE controller, master device

/dev/hda

3

0

Primary IDE controller, master device, first partition

/dev/hda1

3

1

Primary IDE controller, secondary device

/dev/hdb

3

64

Primary IDE controller, secondary device, first partition

/dev/hdb1

3

65

Secondary IDE controller, master device

/dev/hdc

22

0

Secondary IDE controller, secondary device

/dev/hdd

22

64

First SCSI drive

/dev/sda

8

0

First SCSI drive, first partition

/dev/sda1

8

1

Second SCSI disk

/dev/sdb

8

16

Second SCSI disk, first partition

/dev/sdb1

8

17

First SCSI CD-ROM drive

/dev/scd0

11

0

Second SCSI CD-ROM drive

/dev/scd1

11

1

 

  • Some Common Character Devices

Device

Name

Major

Minor

Parallel port 0

/dev/lp0 or /dev/par0

6

0

Parallel port 1

/dev/lp1 or /dev/par1

6

1

First serial port

/dev/ttyS0

4

64

Second serial port

/dev/ttyS1

4

65

IDE tape drive

/dev/ht0

37

0

First SCSI tape drive

/dev/st0

9

0

Second SCSI tape drive

/dev/st1

9

1

System console

/dev/console

5

1

First virtual terminal

/dev/tty1

4

1

Second virtual terminal

/dev/tty2

4

2

Process’s current terminal device

/dev/tty

5

0

Sound card

/dev/audio

14

4

 

6.5 Special Devices

6.5.1. /dev/null

  • Linux discards any data written to /dev/null.

Run a command and discard its standard output, redirect standard output to /dev/null:

% verbose_command > /dev/null

  • Reading from /dev/null always results in an end-of-file.

If you copy from /dev/null to another file, the destination will be a zero-length file:

% cp /dev/null empty-file

% ls -l empty-file

-rw-rw---- 1 samuel samuel 0 Mar 8 00:27 empty-file

 

6.5.2. /dev/zero

  • The device entry /dev/zero behaves as if it were an infinitely long file filled with 0 bytes.
  • As much data as you’d try to read from /dev/zero, Linux “generates” enough 0 bytes.

% ./hexdump /dev/zero

0x000000 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

0x000010 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

0x000020 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

0x000030 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

...

  • Memory mapping /dev/zero is an advanced technique for allocating memory.

6.5.3. /dev/full

  • The entry /dev/full behaves as if it were a file on a file system that has no more room.
  • A write to /dev/full fails and sets errno to ENOSPC.

% cp /etc/fstab /dev/full

cp: /dev/full: No space left on device

 

6.5.4. Random Number Devices

  • The rand function actually generates pseudorandom numbers.
  • By measuring the time delay between your input actions, Linux is capable of generating an unpredictable stream of high-quality random numbers.
  • You can access this stream by reading from /dev/random and /dev/urandom.
  • When Linux exhausts its store of randomness by reading a large number of bytes from /dev/random, Linux blocks the read operation.

Try displaying the contents of /dev/random using the od command

% od -t x1 /dev/random

0000000 2c 9c 7a db 2e 79 3d 65 36 c2 e3 1b 52 75 1e 1a

0000020 d3 6d 1e a7 91 05 2d 4d c3 a6 de 54 29 f4 46 04

0000040 b3 b0 8d 94 21 57 f3 90 61 dd 26 ac 94 c3 b9 3a

0000060 05 a3 02 cb 22 0a bc c9 45 dd a6 59 40 22 53 d4

The output will eventually pause when Linux exhausts its store of randomness. Now try moving your mouse or typing on the keyboard, and watch additional random numbers appear.

  • A read from /dev/urandom will never block.
  • If Linux runs out of randomness, it uses a cryptographic algorithm to generate pseudorandom bytes from the past sequence of random bytes.
  • Function to Generate a Random Number from /dev/random

#include <assert.h>

#include <sys/stat.h>

#include <sys/types.h>

#include <fcntl.h>

#include <unistd.h>

/* Return a random integer between MIN and MAX, inclusive. Obtain

randomness from /dev/random. */

int random_number (int min, int max)

{

    /* Store a file descriptor opened to /dev/random in a static variable. That way, we don’t need to open the file every time

this function is called. */

    static int dev_random_fd = -1;

    char* next_random_byte;

    int bytes_to_read;

    unsigned random_value;

    /* Make sure MAX is greater than MIN. */

    assert (max > min);

    /* If this is the first time this function is called, open a file descriptor to /dev/random. */

    if (dev_random_fd == -1) {

        dev_random_fd = open (“/dev/random”, O_RDONLY);

        assert (dev_random_fd != -1);

    }

    /* Read enough random bytes to fill an integer variable. */

    next_random_byte = (char*) &random_value;

    bytes_to_read = sizeof (random_value);

    /* Loop until we’ve read enough bytes. Because /dev/random is filled from user-generated actions, the read may block and may only return a single random byte at a time. */

    do {

        int bytes_read;

        bytes_read = read (dev_random_fd, next_random_byte, bytes_to_read);

        bytes_to_read -= bytes_read;

        next_random_byte += bytes_read;

    } while (bytes_to_read > 0);

    /* Compute a random number in the correct range. */

    return min + (random_value % (max - min + 1));

}

int main(int argc, char * argv)

{

        while(1)

        {

                int random = random_number(10, 20);

                printf("Get a random number : %d/n",random);

        }

}

  • Run the program compiled from the above code.

[liuchao@localhost Ramdom]$ ./random_number

Get a random number : 11

Get a random number : 17

Get a random number : 11

Get a random number : 18

Get a random number : 13

Get a random number : 11

Get a random number : 14

Get a random number : 20

 

  • Type something randomly in the terminal, and the result will be

[liuchao@localhost Ramdom]$ ./random_number

Get a random number : 11

Get a random number : 17

Get a random number : 11

Get a random number : 18

Get a random number : 13

Get a random number : 11

Get a random number : 14

Get a random number : 20

Get a random number : 19

Get a random number : 11

Get a random number : 16

Get a random number : 14

Get a random number : 12

Get a random number : 18

Get a random number : 12

Get a random number : 15

Get a random number : 17

Get a random number : 13

Get a random number : 15

Get a random number : 11

Get a random number : 11

Get a random number : 16

 

6.5.5. Loopback Devices

  • A loopback device enables you to simulate a block device using an ordinary disk file.
  • Loopback devices are named /dev/loop0, /dev/loop1, and so on. Each can be used to simulate a single block device at one time.
  • Only the superuser can set up a loopback device.
  • To construct a virtual file system and mount it with a loopback device, follow these steps:
  • Create an empty file to hold the virtual file system.

% dd if=/dev/zero of=/tmp/disk-image count=20480

20480+0 records in

20480+0 records out

% ls -l /tmp/disk-image

-rw-rw---- 1 root r oot 1 0485760 Mar 8 01:56 /tmp/disk-image

  • Construct the file to an ext2 file system with the mke2fs command.

% mke2fs -q /tmp/disk-image

mke2fs 1.18, 11-Nov-1999 for EXT2 FS 0.5b, 95/08/09

disk-image is not a block special device.

Proceed anyway? (y,n) y

  • Create an empty directory and mount the file system to the directory using a loopback device.

% mkdir /tmp/virtual-fs

% mount -o loop=/dev/loop0 /tmp/disk-image /tmp/virtual-fs

% df -h /tmp/virtual-fs

Filesystem Size Used Avail Use% Mounted on

/tmp/disk-image 9.7M 13k 9.2M 0% /tmp/virtual-fs

  • You can use it like any other disk:

% cd /tmp/virtual-fs

% echo ‘Hello, world!’ > test.txt

% ls -l

total 13

drwxr-xr-x 2 root root 12288 Mar 8 02:00 lost+found

-rw-rw---- 1 root root 14 Mar 8 02:12 test.txt

% cat test.txt

Hello, world!

  • When you’re done, unmount the virtual file system.

% cd /tmp

% umount /tmp/virtual-fs

  • Instead of creating a file system from scratch, you can copy one directly from a device and mount it as a loop device.

% cp /dev/cdrom /tmp/cdrom-image

% mount -o loop=/dev/loop0 /tmp/cdrom-image /mnt/cdrom

 

6.6 PTYs

  • devpts mounted at /dev/pts and associated with none hardware device is a “magic” file system created by the Linux kernel.
  • /dev/pts is a special directory that varies with time and reflects the state of the running system.
  • Linux creates a PTY for every new terminal window you open and displays a corresponding entry in /dev/pts.
  • The PTY device acts like a terminal device which accepts input from the keyboard and displays text output from the programs.
  • You can determine the PTY associated with a given terminal window

% ps -o pid,tty,cmd

PID TT CMD

28832 pts/4 bash

29287 pts/4 ps -o pid,tty,cmd

This particular terminal window is running in PTY 4.

  • You can read from or write to the PTY device.
  • If you read from it, you’ll hijack keyboard input that would otherwise be sent to the program running in the PTY.
  • If you write to it, the data will appear in that window.

Open two terminals

In one terminal

[liuchao@localhost ~]$ ps -o pid,tty,cmd

  PID TT       CMD

 2413 pts/1    -bash

 3717 pts/1    ps -o pid,tty,cmd

In the other

[liuchao@localhost ~]$ ps -o pid,tty,cmd

  PID TT       CMD

 3163 pts/2    -bash

 3742 pts/2    ps -o pid,tty,cmd

In the first terminal

[liuchao@localhost ~]$ echo "hello world" > /dev/pts/2

In the second terminal

[liuchao@localhost ~]$ hello world

 

6.7 ioctl

  • The ioctl system call is an all-purpose interface for controlling hardware devices.
  • The first argument is a file descriptor.
  • The second argument is a request code that indicates the operation that you want to perform.
  • (cdrom-eject.c) Eject a CD-ROM

#include <fcntl.h>

#include <linux/cdrom.h>

#include <sys/ioctl.h>

#include <sys/stat.h>

#include <sys/types.h>

#include <unistd.h>

int main (int argc, char* argv[])

{

    /* Open a file descriptor to the device specified on the command line. */

    int fd = open (argv[1], O_RDONLY);

    /* Eject the CD-ROM. */

    ioctl (fd, CDROMEJECT);

    /* Close the file descriptor. */

    close (fd);

    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值