额外的memset()导致系统调用open()失败

I'm*_*gon 0 c linux kernel system-calls memset

/dev按照这里的教程(chardev.c)创建了一个节点,我尝试/dev/chardev使用以下代码访问我创建的设备:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h> //perror(), errno
#include <string.h>
#define RSIZE 50 

int main()
{
    int fd,err_save;
    char receive_buff[RSIZE];

    //open device and check for error msg
    fd = open("/dev/chardev", "rw");
    err_save = errno;
    if (fd < 0)
        {
        perror("open perror");
        printf("error opening device, fd = %d, err_save = %d \n", fd,err_save);
        }
    else
        {printf("Device opened\n");}

    //read device and check for error msg
    //memset(receive_buff, 0, sizeof(receive_buff)); //<--- strange
    read(fd, receive_buff, RSIZE);
    err_save = errno;
        if (fd < 0)
        {
        perror("read perror");
        printf("error reading device, fd = %d, err_save = %d \n", fd,err_save);
        }
    else
        {
        printf("Device read successful : %s\n",receive_buff);}

    //close device and check for error msg
    fd = close(fd);
    err_save = errno;
    if (fd < 0)
        {
        perror("close perror");
        printf("error closing device, fd = %d, err_save = %d \n", fd,err_save);
        }
    else
        {printf("Device closed\n");}
    return 0;
}    
Run Code Online (Sandbox Code Playgroud)

成功的结果:

Device opened
Device read successful : I already told you 7 times Hello world!
w?0 ????
Device closed
Run Code Online (Sandbox Code Playgroud)

但是,当memset(receive_buff, 0, sizeof(receive_buff));取消注释时,我得到以下内容:

open perror: File exists
error opening device, fd = -1, err_save = 17 
read perror: Bad file descriptor
error reading device, fd = -1, err_save = 9 
close perror: Bad file descriptor
error closing device, fd = -1, err_save = 9 
Run Code Online (Sandbox Code Playgroud)

问题:附加物如何memset()导致open()失败?

Klo*_*lox 5

open取一个整数作为第二个参数(你搞砸了它fopen).你的open行应该是:

fd = open("/dev/chardev", O_RDWR);
Run Code Online (Sandbox Code Playgroud)

它添加和删除代码时工作或失败的原因必须是地址的不可预测值"rw",这可能恰好是删除open时的有效值memset.