Энциклопедия разработчика модулей ядра Linux | страница 24



>/* _IOR means that we're creating an ioctl command

>* number for passing information from a user process

>* to the kernel module.

>*

>* The first arguments, MAJOR_NUM, is the major device

>* number we're using.

>*

>* The second argument is the number of the command

>* (there could be several with different meanings).

>*

>* The third argument is the type we want to get from

>* the process to the kernel. */


>/* Get the message of the device driver */

>#define IOCTL_GET_MSG _IOR(MAJOR_NUM, 1, char *)

>/* This IOCTL is used for output, to get the message

>* of the device driver. However, we still need the

>* buffer to place the message in to be input,

>* as it is allocated by the process. */


>/* Get the n'th byte of the message */

>#define IOCTL_GET_NTH_BYTE _IOWR(MAJOR_NUM, 2, int)

>/* The IOCTL is used for both input and output. It

>* receives from the user a number, n, and returns Message[n]. */


>/* The name of the device file */

>#define DEVICE_FILE_NAME "char_dev"

>#endif  

ioctl.c 

>/* ioctl.c - the process to use ioctl's to control the

>* kernel module

>*

>* Until now we could have used cat for input and

>* output. But now we need to do ioctl's, which require

>* writing our own process. */

>/* Copyright (C) 1998 by Ori Pomerantz */


>/* device specifics, such as ioctl numbers and the major device file. */

>#include "chardev.h"

>#include /* open */

>#include /* exit */

>#include /* ioctl */


>/* Functions for the ioctl calls */

>ioctl_set_msg(int file_desc, char *message) {

> int ret_val;

> ret_val = ioctl(file_desc, IOCTL_SET_MSG, message);

> if (ret_val < 0) {

>  printf("ioctl_set_msg failed:%d\n", ret_val);

>  exit(-1);

> }

>}


>ioctl_get_msg(int file_desc) {

> int ret_val;

> char message[100];

> /* Warning - this is dangerous because we don't tell

> * the kernel how far it's allowed to write, so it

> * might overflow the buffer. In a real production

> * program, we would have used two ioctls - one to tell

> * the kernel the buffer length and another to give

> * it the buffer to fill */

> ret_val = ioctl(file_desc, IOCTL_GET_MSG, message);

> if (ret_val < 0) {

>  printf("ioctl_get_msg failed:%d\n", ret_val);

>  exit(-1);

> }

> printf("get_msg message:%s\n", message);

>}


>ioctl_get_nth_byte(int file_desc) {

> int i;

> char c;

> printf("get_nth_byte message:");

> i = 0;

> while (c != 0) {

>  c = ioctl(file_desc, IOCTL_GET_NTH_BYTE, i++);

>  if (c < 0) {

>   printf("ioctl_get_nth_byte failed at the %d'th byte:\n", i);

>   exit(-1);