我怎样才能得到serial number一个的hard disk使用驱动器Python上Linux?
在基于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) 从我一直在阅读上由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) 我尝试使用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内核失败.
怎么了?谢谢!
我正在寻找一种方法来accept()阻止阻塞套接字上的呼叫.使用信号不是一种选择,因为这意味着在库中,我不想混淆用户信号.使用select()是另一种选择,因为各种原因,在我的情况下它不是很吸引人.
如果可能的话,可以正常工作的是将套接字设置为非阻塞模式(使用fcntl()和O_NONBLOCK)来自另一个线程,而套接字在accept()呼叫时被阻止.预期的行为是,accept()调用将返回EAGAIN或EWOULDBLOCK在errno.
它真的会这样吗?安全吗?便携式?
如果你知道这种方法对Windows(你需要使用WSAIoctl()和FONBIO)的适用性,我也很感兴趣.
为什么在单独尝试锁定文件时,Ruby的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::EINVAL或Errno::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)场景:我有很多进程需要通过网络获取文件.如果文件已经下载,我希望它缓存在磁盘上.如果另一个进程正在下载该文件,则阻止直到完成下载.
我一直在努力寻找最简单的方法.显而易见的方法是:
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提供)或外部锁定文件方法几乎是标准/必需的?
我的模块依赖的Fcntl模块(https://github.com/manchicken/perl6-Fcntl),很久没有更新了,坏了。但是,如果我手动操作,有一个 fork ( https://github.com/jonathanstowe/perl6-Fcntl ) 对我zef install有用。是否可以在我的模块中指定依赖项,META-6.json以便正确的 github repo 将用于安装模块?
以下是关于在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代码?
我已经在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)
为什么两种情况下的行为不同?我知道这两个不同的锁定机制的明显答案.我在寻找:
fcntl ×10
python ×4
c ×3
flock ×3
linux ×3
file-io ×1
file-locking ×1
github ×1
hard-drive ×1
ioctl ×1
kernel ×1
locking ×1
module ×1
nonblocking ×1
posix ×1
posix-api ×1
python-2.7 ×1
raku ×1
ruby ×1
sockets ×1
system-calls ×1