사용자 공간 C 응용 프로그램에서 Linux 커널 모듈로 보낸 메시지를 인쇄 할 수 없습니다.

가스통

간단한 리눅스 커널 모듈을 개발했습니다.

#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>


ssize_t exer_open(struct inode *pinode, struct file *pfile) {

    return 0;
}

ssize_t exer_read(struct file *pfile, char __user *buffer, size_t length, loff_t *offset) {

    return 0;
}

ssize_t exer_write(struct file *pfile, const char __user *buffer, size_t length, loff_t *offset) {

    return length;
}

ssize_t exer_close(struct inode *pinode, struct file *pfile) {

    return 0;
}

struct file_operations exer_file_operations = { 
    .owner = THIS_MODULE,
    .open = exer_open,
    .read = exer_read,
    .write = exer_write,
    .release = exer_close,
};

int exer_simple_module_init(void) {

    printk(KERN_ALERT "Inside the %s function\n", __FUNCTION__);
    register_chrdev(240, "Simple Char Drv", &exer_file_operations);
    return 0;
}

void exer_simple_module_exit(void) {

    unregister_chrdev(240, "Simple Char Drv");
}

module_init(exer_simple_module_init);
module_exit(exer_simple_module_exit);

insmod문제없이 명령을 사용하여이 모듈을 커널에 삽입합니다 .

이 모듈을 사용하여 내가 개발 한 사용자 공간 프로그램에서 보낸 메시지를 인쇄하고 싶습니다.

#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<fcntl.h>
#include<string.h>
#include<unistd.h>


int main()

{

int ret, fd;
char stringToSend[] = "Hello World !";

fd = open("/dev/char_device", O_RDWR);             // Open the device with read/write access

if (fd < 0)
    {
            perror("Failed to open the device...");
            return errno;
    }

ret = write(fd, stringToSend, strlen(stringToSend)); // Send the string to the LKM

if (ret < 0)
    {
            perror("Failed to write the message to the device.");
            return errno;
    }

return 0;

}

프로그램을 실행하고 tail -f /var/log/messages명령을 사용하여 커널 로그를 살펴보면 다음을 볼 수 있습니다. user.alert kernel: Inside the exer_read function그러나 "Hello World!"라는 메시지가 표시되지 않습니다.

나는 여기에서 내가 무엇을 놓치고 있는지 모르겠다. 특히 나는 아직 모듈을 개발하고 사용하는 데 초보자입니다. 도와주세요, 제발!

가스통

아직도 그에 대한 해결책을 찾지 못하는 사람들을 위해 답이 있습니다.

다음은 모듈입니다.

#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/device.h>  
#include <linux/kernel.h>
#include <linux/uaccess.h>


MODULE_LICENSE("GPL");      
MODULE_AUTHOR("Gaston");  
MODULE_DESCRIPTION("A simple Linux char driver"); 
MODULE_VERSION("0.1"); 

#define MAX 256

static char message[MAX] ="";           ///< Memory for the string that is passed from userspace


ssize_t exer_open(struct inode *pinode, struct file *pfile) {

    printk(KERN_INFO "Device has been opened\n");
    return 0;
}


ssize_t exer_read(struct file *pfile, char __user *buffer, size_t length, loff_t *offset) {

    return 0;
}


ssize_t exer_write(struct file *pfile, const char __user *buffer, size_t length, loff_t *offset) {
    if (length > MAX)
        return -EINVAL;

    if (copy_from_user(message, buffer, length) != 0)
        return -EFAULT;

    printk(KERN_INFO "Received %s characters from the user\n", message);
    return 0;

}   


ssize_t exer_close(struct inode *pinode, struct file *pfile) {

    printk(KERN_INFO "Device successfully closed\n");
    return 0;
}


struct file_operations exer_file_operations = { 
    .owner = THIS_MODULE,
    .open = exer_open,
    .read = exer_read,
    .write = exer_write,
    .release = exer_close,
};


int exer_simple_module_init(void) {

    printk(KERN_INFO "Initializing the LKM\n");
    register_chrdev(240, "Simple Char Drv", &exer_file_operations);
    return 0;
}


void exer_simple_module_exit(void) {

    unregister_chrdev(240, "Simple Char Drv");
}

module_init(exer_simple_module_init);
module_exit(exer_simple_module_exit);

Ans 이것은 응용 프로그램입니다.

#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<fcntl.h>
#include<string.h>
#include<unistd.h>


#define BUFFER_LENGTH 256 

int main()

{

int ret, fd;
char stringToSend[BUFFER_LENGTH];


fd = open("/dev/char_device", O_RDWR);             // Open the device with read/write access

if (fd < 0)
    {
            perror("Failed to open the device...");
            return errno;
    }


printf("Type in a short string to send to the kernel module:\n");

scanf("%s", stringToSend);                // Read in a string (with spaces)

printf("Writing message to the device [%s].\n", stringToSend);

ret = write(fd, stringToSend, strlen(stringToSend)); // Send the string to the LKM

if (ret < 0)
    {
            perror("Failed to write the message to the device.");
            return errno;
    }

return 0;

}

이것이 잘 작동하는 것을 볼 수 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

사용자 프로그램에서 커널로 보낸 메시지를 출력하기 위해 사용자 공간 프로그램과 Linux 커널 모듈 간의 통신을 만드는 방법

분류에서Dev

내 Linux 커널 모듈이 올바른 사용자 공간 응용 프로그램 PID를받지 못합니다.

분류에서Dev

Linux 커널 공간 모듈에서 사용자 공간 정의 함수를 어떻게 실행 / 호출 할 수 있습니까?

분류에서Dev

커널 프로그램에서 stdlib.h를 사용할 수 없으므로 커널 모듈에서 system ()을 사용하는 방법은 무엇입니까?

분류에서Dev

Debian + Linux 커널 3.12.22 :“커널 모듈 로더”옵션을 사용할 수 없습니다.

분류에서Dev

사용자 공간 응용 프로그램에서 커널 공간에서 사용자 정의 함수 호출

분류에서Dev

서명 된 사용자 지정 커널에서 서명 된 모듈을로드 할 수 없습니다.

분류에서Dev

내 응용 프로그램에서 shopify의 할인 세부 정보를 가져올 수 없습니다.

분류에서Dev

커널의 버퍼를 다른 모듈에서 할당 한 사용자 공간으로 매핑

분류에서Dev

모듈의 모듈을 사용할 수 없습니다 응용 프로그램

분류에서Dev

JDBC Java 응용 프로그램에서 DriverManager를 사용할 수 없습니다

분류에서Dev

간단한 javafx 응용 프로그램에서 텍스트를 표시 할 수 없습니다.

분류에서Dev

Linux 커널 모듈 Makefile은 상대 경로를 포함 할 수 없습니다.

분류에서Dev

ClientsModule.registerAsync () 사용시 공유 모듈이 제공하는 모듈에서 내 보낸 서비스에 액세스 할 수 없습니다.

분류에서Dev

내 보낸 하위 모듈에서 상위 모듈의 기호를 사용할 수 없습니다.

분류에서Dev

CAS 서버에서 인증 성공 후에도 응용 프로그램 페이지로 리디렉션 할 수 없습니다.

분류에서Dev

가상 메소드를 호출 할 수 없다는에서 충돌 유지할 것으로 보인다 응용 프로그램에서 작업

분류에서Dev

Java / C ++에서 외부 응용 프로그램에 대해 항상 켜기를 설정할 수 없습니다.

분류에서Dev

Atom을 사용하면 응용 프로그램 자체 나 원래 편집기 탭에서 포커스를 변경할 수 없습니다.

분류에서Dev

로드 된 다른 모듈에 따라 내 보낸 기호를 사용하는 커널 모듈

분류에서Dev

Wordpress는 기존 응용 프로그램에서 사용자를 어떻게 인증 할 수 있습니까?

분류에서Dev

C # WPF 응용 프로그램 웹 브라우저에서 angularjs를 실행할 수 없습니다.

분류에서Dev

C-Linux-프로세스의 자식을 반복하는 사용자 정의 커널 모듈이 커널 로그와 컴퓨터를 날려 버립니다.

분류에서Dev

응용 프로그램을 다시 실행할 때마다 응용 프로그램에 로그인 할 수 없습니다.

분류에서Dev

SSH로 GnuPG에서 내 보낸 OpenPGP 키를 사용할 수 없습니다.

분류에서Dev

ibus를 다시 시작한 후 Wine 응용 프로그램에서 사용할 수 없습니다.

분류에서Dev

"응용 프로그램 패키지를 검사 할 수 없습니다." 내 작업 공간에 포드를 추가 할 때

분류에서Dev

새 (3.11.6) 또는 사용자 지정 커널로 부팅 할 수 없습니다.

분류에서Dev

새 (3.11.6) 또는 사용자 지정 커널로 부팅 할 수 없습니다.

Related 관련 기사

  1. 1

    사용자 프로그램에서 커널로 보낸 메시지를 출력하기 위해 사용자 공간 프로그램과 Linux 커널 모듈 간의 통신을 만드는 방법

  2. 2

    내 Linux 커널 모듈이 올바른 사용자 공간 응용 프로그램 PID를받지 못합니다.

  3. 3

    Linux 커널 공간 모듈에서 사용자 공간 정의 함수를 어떻게 실행 / 호출 할 수 있습니까?

  4. 4

    커널 프로그램에서 stdlib.h를 사용할 수 없으므로 커널 모듈에서 system ()을 사용하는 방법은 무엇입니까?

  5. 5

    Debian + Linux 커널 3.12.22 :“커널 모듈 로더”옵션을 사용할 수 없습니다.

  6. 6

    사용자 공간 응용 프로그램에서 커널 공간에서 사용자 정의 함수 호출

  7. 7

    서명 된 사용자 지정 커널에서 서명 된 모듈을로드 할 수 없습니다.

  8. 8

    내 응용 프로그램에서 shopify의 할인 세부 정보를 가져올 수 없습니다.

  9. 9

    커널의 버퍼를 다른 모듈에서 할당 한 사용자 공간으로 매핑

  10. 10

    모듈의 모듈을 사용할 수 없습니다 응용 프로그램

  11. 11

    JDBC Java 응용 프로그램에서 DriverManager를 사용할 수 없습니다

  12. 12

    간단한 javafx 응용 프로그램에서 텍스트를 표시 할 수 없습니다.

  13. 13

    Linux 커널 모듈 Makefile은 상대 경로를 포함 할 수 없습니다.

  14. 14

    ClientsModule.registerAsync () 사용시 공유 모듈이 제공하는 모듈에서 내 보낸 서비스에 액세스 할 수 없습니다.

  15. 15

    내 보낸 하위 모듈에서 상위 모듈의 기호를 사용할 수 없습니다.

  16. 16

    CAS 서버에서 인증 성공 후에도 응용 프로그램 페이지로 리디렉션 할 수 없습니다.

  17. 17

    가상 메소드를 호출 할 수 없다는에서 충돌 유지할 것으로 보인다 응용 프로그램에서 작업

  18. 18

    Java / C ++에서 외부 응용 프로그램에 대해 항상 켜기를 설정할 수 없습니다.

  19. 19

    Atom을 사용하면 응용 프로그램 자체 나 원래 편집기 탭에서 포커스를 변경할 수 없습니다.

  20. 20

    로드 된 다른 모듈에 따라 내 보낸 기호를 사용하는 커널 모듈

  21. 21

    Wordpress는 기존 응용 프로그램에서 사용자를 어떻게 인증 할 수 있습니까?

  22. 22

    C # WPF 응용 프로그램 웹 브라우저에서 angularjs를 실행할 수 없습니다.

  23. 23

    C-Linux-프로세스의 자식을 반복하는 사용자 정의 커널 모듈이 커널 로그와 컴퓨터를 날려 버립니다.

  24. 24

    응용 프로그램을 다시 실행할 때마다 응용 프로그램에 로그인 할 수 없습니다.

  25. 25

    SSH로 GnuPG에서 내 보낸 OpenPGP 키를 사용할 수 없습니다.

  26. 26

    ibus를 다시 시작한 후 Wine 응용 프로그램에서 사용할 수 없습니다.

  27. 27

    "응용 프로그램 패키지를 검사 할 수 없습니다." 내 작업 공간에 포드를 추가 할 때

  28. 28

    새 (3.11.6) 또는 사용자 지정 커널로 부팅 할 수 없습니다.

  29. 29

    새 (3.11.6) 또는 사용자 지정 커널로 부팅 할 수 없습니다.

뜨겁다태그

보관