Энциклопедия разработчика модулей ядра 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 - 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
>#include
>#include
>/* 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);