当前位置: 技术问答>linux和unix
关于编写程序访问usb设备的问题,请高手解答
来源: 互联网 发布时间:2016-11-06
本文导语: 在网上找过很多相关的资料,始终没有找到解决的办法,希望有高人帮忙,下面描述下我的问题 我的ubuntu装在VM上,在里面,USB设备会自动挂载到/media/disk中,用df -hl命令查看得到如下结果: /dev/sdb 1.9G……(省略...
在网上找过很多相关的资料,始终没有找到解决的办法,希望有高人帮忙,下面描述下我的问题
我的ubuntu装在VM上,在里面,USB设备会自动挂载到/media/disk中,用df -hl命令查看得到如下结果:
/dev/sdb 1.9G……(省略中间可用空间等的显示) /media/disk
用ls -l /dev/sdb命令,得到如下结果:
brw-rw---- 1 root disk 8 , 16 2010-05-20 14:16 /dev/sdb
之后,写了个简单的test程序,来访问/dev/sdb,获得句柄,代码如下:
int main(void)
{
int fd = open("/dev/sdb", O_WRONLY|O_DIRECT);
printf("The file handle is:%xn",fd);
if(fd == -1) close(fd);
close(fd);
printf("The file is closed, open againn");
fd = open("/dev/sdb", O_WRONLY|O_DIRECT);
printf("The file handle is:%xn",fd);
if(fd == -1) close(fd);
close(fd);
}
好了,运行程序的时候,输出的结果为:
The file handle is:ffffffff
The file is closed, open again
The file handle is:ffffffff
说明文件打开失败,fd的值为-1。
后来自己觉得可能是权限问题,在运行test程序前,先执行了如下命令:
sudo chmod 777 /dev/sdb
然后用ls -l /dev/sdb命令查看,得到如下结果:(即为/dev/sdb的权限全开)
brwxrwxrwx 1 root disk 8 , 16 2010-05-20 14:16 /dev/sdb
之后再次运行test程序,输出结果如下:
The file handle is:3
The file is closed, open again
The file handle is:3
(注:不同机器得到的fd值可能不一样,但肯定不为-1)
这说明文件成功打开了,获得了正确的文件标示,本来以为大功告成,可是问题来了
我再次运行test程序的时候,文件又打开失败,结果和未修改权限一样……
后来查明原因,在使用sudo chmod 777 /dev/sdb修改权限后,运行test程序得到正确结果后,权限又会还原为之前的状态,即运行完test程序后,使用ls -l /dev/sdb查看,结果会自动还原为如下状态:
brw-rw---- 1 root disk 8 , 16 2010-05-20 14:16 /dev/sdb
这样一来,每次运行test程序,都要做权限修改~~
我不知道这个问题是不是跟mount方式有关,能不能有办法让usb挂载上去的时候,直接就是brwxrwxrwx的权限状态?我试过在mount的时候 -o 里面设置umask,dmask,fmask等参数,但是不奏效,希望有达人可以帮忙解决~
我在编写ubuntu下的一个程序,这个问题不解决,我后面的事都没法做了,希望知道的高手尽快帮我解答,谢谢
我的ubuntu装在VM上,在里面,USB设备会自动挂载到/media/disk中,用df -hl命令查看得到如下结果:
/dev/sdb 1.9G……(省略中间可用空间等的显示) /media/disk
用ls -l /dev/sdb命令,得到如下结果:
brw-rw---- 1 root disk 8 , 16 2010-05-20 14:16 /dev/sdb
之后,写了个简单的test程序,来访问/dev/sdb,获得句柄,代码如下:
int main(void)
{
int fd = open("/dev/sdb", O_WRONLY|O_DIRECT);
printf("The file handle is:%xn",fd);
if(fd == -1) close(fd);
close(fd);
printf("The file is closed, open againn");
fd = open("/dev/sdb", O_WRONLY|O_DIRECT);
printf("The file handle is:%xn",fd);
if(fd == -1) close(fd);
close(fd);
}
好了,运行程序的时候,输出的结果为:
The file handle is:ffffffff
The file is closed, open again
The file handle is:ffffffff
说明文件打开失败,fd的值为-1。
后来自己觉得可能是权限问题,在运行test程序前,先执行了如下命令:
sudo chmod 777 /dev/sdb
然后用ls -l /dev/sdb命令查看,得到如下结果:(即为/dev/sdb的权限全开)
brwxrwxrwx 1 root disk 8 , 16 2010-05-20 14:16 /dev/sdb
之后再次运行test程序,输出结果如下:
The file handle is:3
The file is closed, open again
The file handle is:3
(注:不同机器得到的fd值可能不一样,但肯定不为-1)
这说明文件成功打开了,获得了正确的文件标示,本来以为大功告成,可是问题来了
我再次运行test程序的时候,文件又打开失败,结果和未修改权限一样……
后来查明原因,在使用sudo chmod 777 /dev/sdb修改权限后,运行test程序得到正确结果后,权限又会还原为之前的状态,即运行完test程序后,使用ls -l /dev/sdb查看,结果会自动还原为如下状态:
brw-rw---- 1 root disk 8 , 16 2010-05-20 14:16 /dev/sdb
这样一来,每次运行test程序,都要做权限修改~~
我不知道这个问题是不是跟mount方式有关,能不能有办法让usb挂载上去的时候,直接就是brwxrwxrwx的权限状态?我试过在mount的时候 -o 里面设置umask,dmask,fmask等参数,但是不奏效,希望有达人可以帮忙解决~
我在编写ubuntu下的一个程序,这个问题不解决,我后面的事都没法做了,希望知道的高手尽快帮我解答,谢谢
|
起码有两种方法
1.把用户加入disk组里。
2.使用udev规则,挂载的时候赋权限。
1.把用户加入disk组里。
2.使用udev规则,挂载的时候赋权限。
|
先su
输入管理员密码再试试,还不行就不是权限问题了
输入管理员密码再试试,还不行就不是权限问题了