'echo' 无限次调用 .write 函数
'echo' calls .write function INFINITE times
上下文
我写了一个Linux设备驱动程序,其中实现了read
和write
功能。问题出在函数写入上,这里是代码的一部分:
ssize_t LED_01_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos)
{
int retval = 0;
PDEBUG(" reading from user space -> wrinting in kernel space\n");
//struct hello_dev *dev = filp->private_data;
if (count > COMMAND_MAX_LENGHT){
printk(KERN_WARNING "[LEO] LED_01: trying to write more than possible. Aborting write\n");
retval = -EFBIG;
goto out;
}
if (down_interruptible(&(LED_01_devices->sem_LED_01))){
printk(KERN_WARNING "[LEO] LED_01: Device was busy. Operation aborted\n");
return -ERESTARTSYS;
}
if (copy_from_user((void*)&(LED_01_devices-> LED_value), buf, count)) {
printk(KERN_WARNING "[LEO] LED_01: can't use copy_from_user. \n");
retval = -EPERM;
goto out_and_Vsem;
}
write_status_to_LED();
PDEBUG(" Value instert: %u \n", LED_01_devices-> LED_value);
out_and_Vsem:
write_times++;
up(&(LED_01_devices->sem_LED_01));
out:
return retval;
}
问题
如果我在 C 编译程序中使用该模块,它可以正常工作,正如预期的那样。
当我执行echo -n 1 > /dev/LED_01
(从命令行)时,它会写入无限次,即使使用 Ctrl+C,它也不会停止。我需要重启。
这里是测试功能正常工作的代码片段:
// ON
result = write(fd, (void*) ON_VALUE, 1);
if ( result != 0 ){
printf("Oh dear, something went wrong with write()! %s\n", strerror(errno));
}
else{
printf("write operation executed succesfully (%u)\n",ON_VALUE[0]);
}
是驱动问题还是我使用方式的问题echo
?
如果需要完整的源代码,所有使用的文件都已存储in this git repository folder
值 return 由内核的 .write
函数解释为:
错误代码,如果小于零(<0
),
写入的字节数,如果大于或等于零 (>=0
)
所以,为了告诉用户所有字节都已写入,.write
函数应该 return 它的 count
参数。
在 .write
函数的情况下,return 归零有一点意义:每个 "standard" 实用程序,如 echo
将再次调用 write()
函数.
上下文
我写了一个Linux设备驱动程序,其中实现了read
和write
功能。问题出在函数写入上,这里是代码的一部分:
ssize_t LED_01_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos)
{
int retval = 0;
PDEBUG(" reading from user space -> wrinting in kernel space\n");
//struct hello_dev *dev = filp->private_data;
if (count > COMMAND_MAX_LENGHT){
printk(KERN_WARNING "[LEO] LED_01: trying to write more than possible. Aborting write\n");
retval = -EFBIG;
goto out;
}
if (down_interruptible(&(LED_01_devices->sem_LED_01))){
printk(KERN_WARNING "[LEO] LED_01: Device was busy. Operation aborted\n");
return -ERESTARTSYS;
}
if (copy_from_user((void*)&(LED_01_devices-> LED_value), buf, count)) {
printk(KERN_WARNING "[LEO] LED_01: can't use copy_from_user. \n");
retval = -EPERM;
goto out_and_Vsem;
}
write_status_to_LED();
PDEBUG(" Value instert: %u \n", LED_01_devices-> LED_value);
out_and_Vsem:
write_times++;
up(&(LED_01_devices->sem_LED_01));
out:
return retval;
}
问题
如果我在 C 编译程序中使用该模块,它可以正常工作,正如预期的那样。
当我执行echo -n 1 > /dev/LED_01
(从命令行)时,它会写入无限次,即使使用 Ctrl+C,它也不会停止。我需要重启。
这里是测试功能正常工作的代码片段:
// ON
result = write(fd, (void*) ON_VALUE, 1);
if ( result != 0 ){
printf("Oh dear, something went wrong with write()! %s\n", strerror(errno));
}
else{
printf("write operation executed succesfully (%u)\n",ON_VALUE[0]);
}
是驱动问题还是我使用方式的问题echo
?
如果需要完整的源代码,所有使用的文件都已存储in this git repository folder
值 return 由内核的 .write
函数解释为:
错误代码,如果小于零(
<0
),写入的字节数,如果大于或等于零 (
>=0
)
所以,为了告诉用户所有字节都已写入,.write
函数应该 return 它的 count
参数。
在 .write
函数的情况下,return 归零有一点意义:每个 "standard" 实用程序,如 echo
将再次调用 write()
函数.