LINUX.ORG.RU

И какие же данные? Ты выделил буфер в котором может быть мусор без инициализации. Вот этот мусор и передаешь.

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от i-rinat

Обясника в чём дело, интересно. Я только знаю что 4096 максимум за раз можно передать, да и то, только из-за значения count.k

u0atgKIRznY5
() автор топика

Ой. забыл совсем. У меня другой текст был. Щас покажу. Вот.

        char *data = kstrdup ( "test", GFP_USER );
        copy_to_user ( buf, data, 5 ); 
        kfree ( data );

u0atgKIRznY5
() автор топика

А. Надо во write писать, чтобы я мог read получить. Вот как в write.


ssize_t scull_write ( struct file *file, const char __user *buf, size_t n, loff_t *lt )
{
        char *data = kstrdup ( "test", GFP_USER );
        copy_to_user ( buf, data, 4 ); 
        kfree ( data );
        lt += 4;

}

u0atgKIRznY5
() автор топика

У меня как то получилось принять 4 символа, но они было «tttt», после некоторых изменений, у меня опять ничего не принимается.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Разницу между lt += 4; и *lt += 4; заметишь ?

А еще не плохо бы «return 4;» в конце сделать делать. Оно вроде как «ssize_t scull_write()» описано.

vel ★★★★★
()
Ответ на: комментарий от vel

Да точно, return надо. Вот правильный вариант.

ssize_t scull_read ( struct file *file, char __user *buf, size_t count, loff_t *pos)
{
  char *data = kstrdup ( "test", GFP_USER );
  copy_to_user ( buf, data, 4 ); 
  kfree ( data );
  pos += 4;
  return 4;
}

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Мда. Думать ты не хочешь.

pos += 4;
Выброси эту строку. От нее нет никакой пользы. Посмотри внимательно на прототип функции.

vel ★★★★★
()
Ответ на: комментарий от vel

А никак нельзя сделать, чтобы эти две строки по отдельности отправились?

ssize_t scull_read ( struct file *file, char __user *buf, size_t count, loff_t *pos)
{

        char *data = kstrdup ( "test", GFP_USER );
        char *sdata = kstrdup ( "new", GFP_USER );
        copy_to_user ( buf, data, 4 ); 
        copy_to_user ( buf, sdata, 3 ); 
        kfree ( data );
        kfree ( sdata );
        return 7;

}

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Я вообще не понимаю зачем все эти kstrdup() !

static char x[]="zdasdfasdfa";

copy_to_user(buf, z, sizeof(x));

copy_to_user() возвращает код завершения.

vel ★★★★★
()
Ответ на: комментарий от vel

И указать не эту область памяти. Вот man.

KSTRDUP(9)                          Memory Management in Linux                         KSTRDUP(9)

NAME
       kstrdup - allocate space for and copy an existing string

SYNOPSIS
       char * kstrdup(const char * s, gfp_t gfp);

ARGUMENTS
       s
           the string to duplicate

       gfp
           the GFP mask used in the kmalloc call when allocating memory

COPYRIGHT
Kernel Hackers Manual 4.10                  April 2017                                 KSTRDUP(9)

u0atgKIRznY5
() автор топика
Ответ на: комментарий от vel

А что не так? Почему возвращается только четыре постоянно байта? Вот код.

        char data[255];
        char *p, *h;
        p = &data[0];

        struct task_struct *task;
        int i = 0;
        int len = 0;

        for ( task = current; task != &init_task; task = task->parent )
        {
                h = &task->comm[0];

                while ( *h != 0 )
                {
                        *p = *h;
                        p++;
                        h++;
                        len++;
                }

        }
        printk ( KERN_NOTICE "len %d\n", len );
        copy_to_user ( buf, data, len ); 
        return len;

u0atgKIRznY5
() автор топика
Ответ на: комментарий от vel

А. Всё нормально, я в программе fread 4 байти принимал!

u0atgKIRznY5
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.