以下是关于在Linux中重置串口的示例,我想翻译以下代码段
fd = open(filename, O_WRONLY);
ioctl(fd, USBDEVFS_RESET, 0);
close(fd);
Run Code Online (Sandbox Code Playgroud)
到有效的python代码.这是我到目前为止所尝试的
file_handler = open(self._port, 'w')
fcntl.ioctl(file_handler, termios.USBDEVFS_RESET)
file_handler.close()
Run Code Online (Sandbox Code Playgroud)
以错误结束'module' object has no attribute 'USBDEVFS_RESET'.该termios的文件是不是在这一点上是非常有帮助的,因为它没有列出的可能的性质termios.有关此类属性的示例,另请参见fcntl文档termios.
如何正确地将C代码"转换"为python2.7代码?
我试图在我的Linux操作系统中获取IPv6地址,如下所示:
sd = Socket_m(AF_INET6_m, SOCK_DGRAM_m, 0);
ifc.ifc_buf = buffer_p;
ifc.ifc_len = buffSize;
Ioctl_m(sd, SIOCGIFCONF, &ifc);
Run Code Online (Sandbox Code Playgroud)
如果为接口配置了任何IPv4地址,它会成功运行,但如果接口只有一个IPv6地址,则ioctl不会返回该地址.
例如,我无法获取followith接口的IPv6地址,因为只配置了IPv6地址:
br1 Link encap:Ethernet HWaddr 00:10:18:2D:BB:34
inet6 addr: fe80::210:18ff:fe2d:be54/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:194244850 errors:0 dropped:0 overruns:0 frame:0
TX packets:72005 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:12331900995 (11760.6 Mb) TX bytes:6192406 (5.9 Mb)
Run Code Online (Sandbox Code Playgroud) 我正在运行一个自托管的 Renovate 实例,我需要使用 GPG 密钥签署对 GitLab 的提交。
为此,我使用我的 GitLab 用户的 PGP 私钥块设置环境变量 RENOVATE_GIT_PRIVATE_KEY,并且该变量会自动导入。
但当我尝试这样做时,出现以下错误:
gpg: directory '/home/ubuntu/.gnupg' created
gpg: keybox '/home/ubuntu/.gnupg/pubring.kbx' created
gpg: /home/ubuntu/.gnupg/trustdb.gpg: trustdb created
gpg: key 72A96C0D4FA8543C: public key "Dummy User <dummyuser@company.com>" imported
gpg: key 72A96C0D4FA8543C/72A96C0D4FA8543C: error sending to agent: Inappropriate ioctl for device
gpg: error building skey array: Inappropriate ioctl for device
gpg: error reading '/tmp/git-private.key': Inappropriate ioctl for device
gpg: import from '/tmp/git-private.key' failed: Inappropriate ioctl for device
gpg: Total number processed: 0
gpg: imported: 1 …Run Code Online (Sandbox Code Playgroud) 是否有可能在Linux中扩展ioctl接口,以便用户空间应用程序可以向内核空间驱动程序发送指向函数的指针?
我特别想到了以用户可控方式处理流的方法,但是在内核中进行处理.这些操作可以附加到内核模块,但这会使开发变得更容易,因为我不需要在开发期间搞乱内核.
更具体地说,这将是一个过程:
如何在Haskell中获得终端的宽度?
我试过的事情
System.Posix.IOCtl (could not figure out how to get it to work)
Run Code Online (Sandbox Code Playgroud)
这只需要工作unix.
谢谢
这是ioctl用户空间中的调用:
int ioctl(int fd, int cmd, ...);
Run Code Online (Sandbox Code Playgroud)
据我所知,当我们想要执行IO操作时,我们ioctl使用一组请求(命令)定义我们自己的函数,将我们分配ioctl给file_operations结构,如下所示:
struct file_operations fops = {
.read = device_read,
.write = device_write,
.ioctl = device_ioctl, // device_ioctl is our function
.open = device_open,
.release = device_release,
};
Run Code Online (Sandbox Code Playgroud)
与device_ioctl用户空间接口相比,该功能的定义不同:
static long device_ioctl(struct file *f, unsigned int cmd, unsigned long arg)
Run Code Online (Sandbox Code Playgroud)
我认为基于文件描述符,内核可以获得适当的文件结构并调用设备ioctl.
这只是一个猜测,因为我找不到通用函数定义,其中内核ioctl根据fd传递到泛型ioctl接口的文件描述符选择适当的函数?ioctl我只能找到3个定义,但显然那些只是设备的定义,而不是内核:ioctl
我试图在Linux上使用IOCTL接口获取和设置IP地址.我成功地得到并设置它.当我设置IP地址时,会
ifconfig eth0显示正确的IP地址,但系统会断开连接.即系统不可ping.这是我设置IP地址的代码.如果我错过了什么,请告诉我.
struct ifreq ifr;
in_addr_t in_addr;
struct sockaddr_in sin;
memset(&ifr, 0, sizeof(struct ifreq));
memset(&sin, 0, sizeof(struct sockaddr_in));
sockfd = socket(AF_INET, SOCK_STREAM, 0);
sprintf(ifr.ifr_name, "eth0");
in_addr = inet_addr("192.168.101.17");
sin.sin_addr.s_addr = in_addr;
memcpy(&ifr.ifr_addr, &sin, sizeof(struct sockaddr));
io = ioctl(sockfd, SIOCSIFADDR, (char *)&ifr);
Run Code Online (Sandbox Code Playgroud) 我一直在做一些研究,我对这个宏有点困惑.希望有人可以给我一些指导.我有一些ioctl代码(我继承了,没有编写),如果access_ok()在继续从用户空间复制数据之前检查是否它会做的第一件事:
#define __lddk_copy_from_user(a,b,c) copy_from_user(a,b,c)
#define __lddk_copy_to_user(a,b,c) copy_to_user(a,b,c)
long can_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
switch(cmd) {
case COMMAND:
if(! access_ok(VERIFY_READ, (void *)arg, sizeof(Message_par_t)))
return(retval);
if(! access_ok(VERIFY_WRITE, (void *)arg, sizeof(Message_par_t)))
return(retval);
argp = &Command;
__lddk_copy_from_user( (void *) argp,(Command_par_t *) arg, sizeof(Command_par_t));
Run Code Online (Sandbox Code Playgroud)
所以代码工作正常,但我不确定它是否需要.第一个问题来自access_ok的返回描述:
所以这意味着它真的什么都没做,那么确保我们检查的指针可能在用户空间中被初始化了?既然我们知道除了用户空间调用之外我们不能进入这个功能,除非我们为这个设备打开一个有效的文件描述符,否则它不会发生,这真的需要吗?它确实比确保我们没有得到NULL指针更安全吗?
第二个问题来自这个描述:
这是否意味着我的代码中的第一次检查是多余的?如果我们要检查可写区域,我们可以作为免费赠品阅读吗?
我正在使用x86架构,所以access_ok()和__range_no_ok()的定义来自/usr/src/linux-3.1.10-1.16/arch/x86/include/asm/uaccess.h,如下所示:
#define access_ok(type, addr, size) (likely(__range_not_ok(addr, size) == 0))
#define __range_not_ok(addr, size) \
({ \
unsigned long flag, roksum; \
__chk_user_ptr(addr); \
asm("add %3,%1 ; sbb …Run Code Online (Sandbox Code Playgroud) 我正在寻找一个明确的规范描述ioctl 0x1268(BLKSSZGET)的预期参数和行为.
这个数字在许多地方声明(其中没有一个包含确定的参考源),例如linux/fs.h,但我找不到它的规范.
当然,过去某些人确定0x1268会获得设备的物理扇区大小并记录在某处.这些信息来自哪里,我在哪里可以找到它?
编辑:我不是在问BLKSSZGET一般做什么,也不是在问它定义了什么标题.我正在寻找一个明确的,标准化的来源,说明它应该采用什么参数类型以及它应该对任何驱动程序的行为实现它.
具体来说,我问,因为在util-linux 2.23(和2.24)中似乎存在一个错误,blkdiscard其中扇区大小被查询到a uint64_t,但是高32位是未触及的,因为BLKSSZGET 似乎期望一个32位整数,这会导致不正确的扇区大小,不正确的对齐计算以及blkdiscard何时应该成功的失败.所以在我提交补丁之前,我需要绝对确定地确定问题是blkdiscard应该使用32位整数,还是我的内核中的驱动程序实现应该使用64位整数.
编辑2:由于我们是关于这个主题的,所以建议的补丁假定blkdiscard不正确的是:
--- sys-utils/blkdiscard.c-2.23 2013-11-01 18:28:19.270004947 -0400
+++ sys-utils/blkdiscard.c 2013-11-01 18:29:07.334002382 -0400
@@ -71,7 +71,8 @@
{
char *path;
int c, fd, verbose = 0, secure = 0;
- uint64_t end, blksize, secsize, range[2];
+ uint64_t end, blksize, range[2];
+ uint32_t secsize;
struct stat sb;
static const struct option longopts[] = {
@@ -146,8 +147,8 @@ …Run Code Online (Sandbox Code Playgroud) 我正在使用 Rails Web 应用程序并尝试使用以下脚本将 xml 文件发送到 sftp 服务器:
Net::SSH.start(SFTP_HOST, sftp_user, {:port => SFTP_PORT, :password => sftp_password}) do |ssh|
ssh.sftp.connect do |sftp|
sftp.upload!( measurements_xml_file_path( meas ).to_s ) do |event, uploader, *args|
case even
when :open
puts "Starting upload"
when :finish
puts "Finished upload"
return true
end
end
end
Run Code Online (Sandbox Code Playgroud)
尽管如此,我总是收到错误"Errno::ENOTTY ... Inappropriate ioctl for device"。有帮助如何修复此错误吗?