标签: fcntl

如何使用Python获取硬盘序列号

我怎样才能得到serial number一个的hard disk使用驱动器PythonLinux

我想使用Python模块来执行此操作,而不是运行外部程序,如hdparm.也许使用fcntl模块?

python linux serial-number fcntl hard-drive

32
推荐指数
1
解决办法
2万
查看次数

Python fcntl没有按预期锁定

在基于Debian的操作系统(Ubuntu,Debian Squeeze)上,我使用Python(2.7,3.2)fcntl来锁定文件.据我所知,fnctl.flock以某种方式锁定文件,如果另一个客户端想要锁定同一个文件,则会抛出异常.

我构建了一个小例子,我希望抛出一个例外,因为我先锁定文件,然后,我立即尝试再次锁定它:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import fcntl
fcntl.flock(open('/tmp/locktest', 'r'), fcntl.LOCK_EX)
try:
    fcntl.flock(open('/tmp/locktest', 'r'), fcntl.LOCK_EX | fcntl.LOCK_NB)
except IOError:
    print("can't immediately write-lock the file ($!), blocking ...")
else:
    print("No error")
Run Code Online (Sandbox Code Playgroud)

但该示例只是打印"无错误".

如果我将此代码分割为两个同时运行的客户端(一个锁定然后等待,另一个在第一个锁已经激活后尝试锁定),我得到相同的行为 - 完全没有效果.

对这种行为的解释是什么?

编辑:

根据nightcracker的要求进行更改,此版本还会打印"No error",尽管我不希望这样:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import fcntl
import time
fcntl.flock(open('/tmp/locktest', 'w'), fcntl.LOCK_EX | fcntl.LOCK_NB)
try:
    fcntl.flock(open('/tmp/locktest', 'w'), fcntl.LOCK_EX | fcntl.LOCK_NB)
except IOError:
    print("can't immediately write-lock the file ($!), blocking ...")
else:
    print("No error")
Run Code Online (Sandbox Code Playgroud)

python fcntl

23
推荐指数
4
解决办法
3万
查看次数

O_NONBLOCK是否设置了文件描述符或基础文件的属性?

从我一直在阅读上由The Open Group网站上fcntl,open,read,和write,我得到的印象是,是否O_NONBLOCK被设置在一个文件描述符,因此非阻塞I/O是否使用与描述符,应该是一个属性该文件描述符而不是底层文件.作为文件描述符的属性意味着,例如,如果我复制文件描述符或打开另一个描述符到同一个文件,那么我可以使用阻塞I/O和一个非阻塞I/O与另一个.

然而,尝试使用FIFO,似乎不可能同时为FIFO提供阻塞I/O描述符和非阻塞I/O描述符(因此O_NONBLOCK设置是否是基础文件的属性[FIFO] ):

#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    int fds[2];
    if (pipe(fds) == -1) {
        fprintf(stderr, "`pipe` failed.\n");
        return EXIT_FAILURE;
    }

    int fd0_dup = dup(fds[0]);
    if (fd0_dup <= STDERR_FILENO) {
        fprintf(stderr, "Failed to duplicate the read end\n");
        return EXIT_FAILURE;
    }

    if (fds[0] == fd0_dup) {
        fprintf(stderr, "`fds[0]` should not equal `fd0_dup`.\n");
        return EXIT_FAILURE;
    }

    if …
Run Code Online (Sandbox Code Playgroud)

c file-descriptor nonblocking fcntl posix-api

19
推荐指数
1
解决办法
2万
查看次数

open()不设置O_CLOEXEC标志

我尝试使用open()设置O_CLOEXEC标志并且没有成功.

考虑以下microtest:

#include <stdio.h>
#include <fcntl.h>

int main() {
  int fd = open("test.c", O_RDONLY | O_CLOEXEC);
  int ret = fcntl(fd, F_GETFL);
  if(ret & O_CLOEXEC) {
    printf("OK!\n");
  } else {
    printf("FAIL!\n");
  }
  printf("fd = %d\n", fd);
  printf("ret = %x, O_CLOEXEC = %x\n", ret, O_CLOEXEC);
  return 0;
} 
Run Code Online (Sandbox Code Playgroud)

当在具有内核版本2.6的Linux上运行时,测试成功并打印"OK!",但是使用3.8或3.9内核失败.

怎么了?谢谢!

c linux kernel system-calls fcntl

12
推荐指数
1
解决办法
1919
查看次数

是否可以(并且安全)使接受套接字无阻塞?

我正在寻找一种方法来accept()阻止阻塞套接字上的呼叫.使用信号不是一种选择,因为这意味着在库中,我不想混淆用户信号.使用select()是另一种选择,因为各种原因,在我的情况下它不是很吸引人.

如果可能的话,可以正常工作的是将套接字设置为非阻塞模式(使用fcntl()O_NONBLOCK)来自另一个线程,而套接字在accept()呼叫时被阻止.预期的行为是,accept()调用将返回EAGAINEWOULDBLOCKerrno.

它真的会这样吗?安全吗?便携式?

如果你知道这种方法对Windows(你需要使用WSAIoctl()FONBIO)的适用性,我也很感兴趣.

c sockets posix fcntl

11
推荐指数
1
解决办法
2万
查看次数

如何使用File#flock对独占锁进行非阻塞请求?

我该如何申请非阻塞锁?

为什么在单独尝试锁定文件时,Ruby的File#flock不能按预期工作?锁定块中的文件不是解决此问题的正确方法,因为重点是显示锁定持久锁的行为.在块中使用File#flock会在块退出时释放锁定,因此它不能正确显示问题.

File#flock以各种方式失败,尤其是在请求非阻塞锁定时.一些例子如下.

File#flock失败的例子

  • 使用多个独占锁时无限等待,因为#flock不提供超时锁定请求的方法.

    # First lock succeeds.
    f1 = File.open('foo', File::RDWR|File::CREAT, 0644)
    f1.flock(File::LOCK_EX)
    # => 0
    
    # This never returns.
    f2 = File.open('foo', File::RDWR|File::CREAT, 0644)
    f2.flock(File::LOCK_EX)
    
    Run Code Online (Sandbox Code Playgroud)
  • 在文件被独占锁定时请求非阻塞锁定会导致无效的参数异常.

    f1 = File.open('foo', File::RDWR|File::CREAT, 0644)
    f1.flock(File::LOCK_EX)
    # => 0
    
    f2 = File.open('foo', File::RDWR|File::CREAT, 0644)
    f2.flock(File::LOCK_NB)
    # => Errno::EINVAL: Invalid argument - foo
    
    Run Code Online (Sandbox Code Playgroud)
  • 文档说#flock"根据locking_constant(逻辑或下表中的值)锁定或解锁文件." 但是,Logical OR会提升Errno::EINVALErrno::EBADF取决于平台.

    f1 = File.open('foo', File::RDWR|File::CREAT, 0644)
    f1.flock(File::LOCK_EX)
    # => 0
    
    f2 = File.open('foo', File::RDWR|File::CREAT, 0644)
    f2.flock(File::LOCK_NB || File::LOCK_EX)
    # …
    Run Code Online (Sandbox Code Playgroud)

ruby locking flock fcntl

11
推荐指数
1
解决办法
4791
查看次数

如何在Linux中自动创建锁定文件?

场景:我有很多进程需要通过网络获取文件.如果文件已经下载,我希望它缓存在磁盘上.如果另一个进程正在下载该文件,则阻止直到完成下载.

我一直在努力寻找最简单的方法.显而易见的方法是:

create file w/ an exclusive lock active on it only if it doesn't exist (O_CREAT | O_EXCL)
if file exists already:
   open file and acquire exclusive lock
else:
   download to newly created file
release lock
Run Code Online (Sandbox Code Playgroud)

该系统通过(看似)没有竞争条件来实现上述目标

不幸的是,我找不到有关如何使用open()等创建一个在Linux中锁定的文件的文档.如果我将创建步骤拆分为:

open w/ O_CREAT | O_EXCL
flock
Run Code Online (Sandbox Code Playgroud)

现在,创建和锁定之间存在竞争条件(非创建进程在创建者执行之前获取锁定).

我意识到我可以在每个文件中使用一个外部锁定文件(例如filename +'.lock),这是我在尝试创建文件名之前获得的,但这感觉...不优雅(我现在需要担心如何实际拥有一个文件.lock后缀!)

反正原子创建和锁定它(如Windows提供)或外部锁定文件方法几乎是标准/必需的?

linux file-io flock fcntl

10
推荐指数
1
解决办法
5458
查看次数

如何在 Raku 中指定 github repo 作为模块的依赖源?

我的模块依赖的Fcntl模块(https://github.com/manchicken/perl6-Fcntl),很久没有更新了,坏了。但是,如果我手动操作,有一个 fork ( https://github.com/jonathanstowe/perl6-Fcntl ) 对我zef install有用。是否可以在我的模块中指定依赖项,META-6.json以便正确的 github repo 将用于安装模块?

module github fcntl raku

10
推荐指数
1
解决办法
111
查看次数

如何正确地将C ioctl调用转换为python fcntl.ioctl调用?

以下是关于在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代码?

python ioctl fcntl python-2.7

9
推荐指数
3
解决办法
9814
查看次数

python lockf和flock行为

我已经在stackoverflow上阅读了关于差异b/w的足够帖子,flock/lockf/fcntl但我无法回答以下观察:

>>> import fcntl
>>> a = open('/tmp/locktest', 'w')
>>> b = open('/tmp/locktest', 'w')
>>> fcntl.lockf(a, fcntl.LOCK_EX | fcntl.LOCK_NB)
>>> fcntl.lockf(a, fcntl.LOCK_EX | fcntl.LOCK_NB)
>>> fcntl.lockf(b, fcntl.LOCK_EX | fcntl.LOCK_NB)
>>>
>>> a.close()
>>> b.close()

>>> a = open('/tmp/locktest', 'w')
>>> b = open('/tmp/locktest', 'w')
>>> fcntl.flock(a, fcntl.LOCK_EX | fcntl.LOCK_NB)
>>> fcntl.flock(a, fcntl.LOCK_EX | fcntl.LOCK_NB)
>>> fcntl.flock(b, fcntl.LOCK_EX | fcntl.LOCK_NB)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 35] Resource temporarily unavailable
Run Code Online (Sandbox Code Playgroud)

为什么两种情况下的行为不同?我知道这两个不同的锁定机制的明显答案.我在寻找:

  1. 实际上lockf()或flock()对文件(inode/fd)的作用是什么? …

python file-locking flock fcntl

9
推荐指数
1
解决办法
6250
查看次数