2015-07-01 44 views
0

我“正在写在C(Linux)的字符设备我有这个功能。C:控制达到非void函数的结束...即使它返回int?

static ssize_t 
device_write(struct file *file, 
    const char __user * buffer, size_t length, loff_t * offset) 
{ 
    int i, fd = 0; 
    int = bytes_written; 

    fd = open(file, O_WRONLY); 

    printk("device_write(%p,%d)\n", file, length); 

    for (i = 0; i < length && i < BUF_LEN-1; i++) 
     get_user(Message[i], buffer + i); 

    bytes_written = write(fd,Message,i); 
    Message[BUF_LEN-1] = '\0'; 
    /* return the number of input characters used */ 
    return bytes_written; 
} 

当我编译我得到的错误:控制到达非void函数的最后,我仔细检查过我正在编译正确的程序,它的驾驶我坚果。

任何帮助将受到欢迎。

而且,稍不相关的,但有可能给init一个字符缓冲区,以一定的字符串(如炭buffer[1000] = "HELLO")?

+1

该函数有很多错误。 –

+1

开始:您从无符号函数中返回一个带符号的int。使用相同的类型! – Olaf

+1

是的,你可以用字符串文字初始化一个char数组。所有没有单独初始化的元素都得到一个''\ 0'... ...'在char buffer [1000] =“HELLO”之后;''buffer [5]'到'buffer [999]'(含)的所有元素都有那''\ 0'' – pmg

回答

2

的功能有很多问题

  1. 这是无效

    int = bytes_written; 
    

    也许你的意思是

    int bytes_written; 
    
  2. 您必须检查fd != -1,任何代码以下open()将“可能“原因无效的文件描述符错误,因为您不能保证fd是有效的描述符。

    而且你甚至无法知道是否设置错误或没有,因为

    1. 你不检查write()是否成功。
    2. 您不检查每次通话后errno的值是多少,可以设置为!= 0,即open()write()
  3. Message[BUF_LEN-1] = '\0';很可能是错的,它会是Message[i - 1] = '\0';

    而且似乎顺理成章的事情

    memcpy(Message, buffer, length); 
    Message[length] = '\0'; 
    
  4. 正如@zwol评论说,您不能使用open()write()从内核空间。

+0

4)'open'和'写'不能从内核空间直接使用AFAIK 5)'fd'永远不会关闭 – zwol

+0

@zwol我不知道,但我无论如何添加。 –

+0

加入这个快乐地混合符号和无符号和不同类型(为ssize_t ,size_t等),这更像代码审查。 – Olaf

0

int = bytes_written;应该是int bytes_written;至少可以解决你目前的错误。可能还有其他人。

+0

这不回答这个问题会更好评论 – Olaf

+0

其实,从外观应该是'为ssize_t bytes_written;' –

相关问题