Linux - статьи


              

Для передачи данных из пространства


/* * Для передачи данных из пространства ядра в пространство пользователя * следует использовать put_user. * В обратном направлении -- get_user. */ sprintf(message, "Last input:%s\n", Message); for (i = 0; i < len && message[i]; i++) put_user(message[i], buf + i);
finished = 1; return i; /* Вернуть количество "прочитанных" байт */ }
/* * Эта функция принимает введенное пользователем сообщение */ static ssize_t module_input(struct file *file, /* Собственно файл */ const char *buf, /* Буфер с сообщением */ size_t length, /* размер буфера */ loff_t * offset) { /* смещение в файле - игнорируется */ int i;
/* * Переместить данные, полученные от пользователя в буфер, * который позднее будет выведен йункцией module_output. */ for (i = 0; i < MESSAGE_LENGTH - 1 && i < length; i++) get_user(Message[i], buf + i);
/* Обычная строка, завершающаяся символом \0 */ Message[i] = '\0';
/* * Вернуть число принятых байт */ return i; }
/* * 1 -- если файл открыт */ int Already_Open = 0;
/* * Очередь ожидания */ DECLARE_WAIT_QUEUE_HEAD(WaitQ); /* * Вызывается при открытии файла в /proc */ static int module_open(struct inode *inode, struct file *file) { /* * Если установлен флаг O_NONBLOCK, * то процесс не должен приостанавливаться * В этом случае, если файл уже открыт, * необходимо вернуть код ошибки * -EAGAIN, что означает "попробуйте в другой раз" */ if ((file->f_flags & O_NONBLOCK) && Already_Open) return -EAGAIN;
/* * Нарастить счетчик обращений, * чтобы невозможно было выгрузить модуль */ try_module_get(THIS_MODULE);
/* * Если файл уже открыт -- приостановить процесс */
while (Already_Open) { int i, is_sig = 0;
/* * Эта функция приостановит процесс и поместит его в очередь ожидания. * Исполнение процесса будет продолжено с точки, следующей за вызовом * этой функции, когда кто нибудь сделает вызов * wake_up(&WaitQ) (это возможно только внутри module_close, когда * файл будет закрыт) или когда процессу поступит сигнал Ctrl-C */ wait_event_interruptible(WaitQ, !Already_Open);

Содержание  Назад  Вперед