Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在linux中模拟设备驱动程序崩溃。让python重新加载它_Python_Linux - Fatal编程技术网

在linux中模拟设备驱动程序崩溃。让python重新加载它

在linux中模拟设备驱动程序崩溃。让python重新加载它,python,linux,Python,Linux,我有一个使用uvcvideo模块在Linux上运行的网络摄像头。我正在使用python应用程序访问网络摄像头并显示图像 如果网络摄像机由于某种原因无法工作,我希望python程序能够处理它。刚卸下模块就进行了测试。如果在运行python代码之前卸载模块,效果很好,但是如果在使用中强制卸载模块,我会得到以下反馈 VIDIOC_DQBUF: Inappropriate ioctl for device 如果我杀死python代码并重新启动它,整个机器就会冻结 我试图运行的代码是 import py

我有一个使用uvcvideo模块在Linux上运行的网络摄像头。我正在使用python应用程序访问网络摄像头并显示图像

如果网络摄像机由于某种原因无法工作,我希望python程序能够处理它。刚卸下模块就进行了测试。如果在运行python代码之前卸载模块,效果很好,但是如果在使用中强制卸载模块,我会得到以下反馈

VIDIOC_DQBUF: Inappropriate ioctl for device
如果我杀死python代码并重新启动它,整个机器就会冻结

我试图运行的代码是

import pygame
import Image
from pygame.locals import *
import sys
import time, os

import opencv
from opencv import highgui 

camera = highgui.cvCreateCameraCapture(0)
fps = 10.0
pygame.init()
window = pygame.display.set_mode((640,480))
pygame.display.set_caption("WebCam Demo")
screen = pygame.display.get_surface()

while True:
 events = pygame.event.get()
 for event in events:
  if event.type == QUIT or event.type == KEYDOWN:
   sys.exit(0)
 while True:
  try:
   ima = highgui.cvQueryFrame(camera)
   im = opencv.adaptors.Ipl2PIL(ima)
   break;
  except TypeError:
   print 'No camera'
   os.system('sudo modprobe uvcvideo')
   time.sleep(1)
   camera = highgui.cvCreateCameraCapture(0)

 pg_img = pygame.image.frombuffer(im.tostring(), im.size, im.mode)
 screen.blit(pg_img, (0,0))
 pygame.display.flip()
 pygame.time.delay(int(1000 * 1.0/fps))
这是它的一个修改版本,它使用的是openvc版本1.x,而不是2.x


你知道怎么做吗?

当任何进程都在使用内核驱动程序时,如果你试图删除它,Linux真的不喜欢。我不相信你的userland应用程序有什么好方法可以做到这一点(让你的应用程序尝试运行‘sudo modprobe uvcvideo’已经够可怕了)。

你是说USB摄像头吗?我不知道在使用模块时强制卸载,但这不会发生,也不是一个很好的模拟相机不再工作的方法。首先尝试优雅地处理相机断开/重新连接

我不知道您在模拟驱动程序崩溃时试图实现什么,但您无法处理驱动程序崩溃,这可能会导致用户代码出现oops或其他问题。一旦内核代码变得疯狂,没有任何防御性编程可以拯救您

现在,如果驱动程序代码中发生错误(错误与崩溃不同),那么应该将其返回给您,您所能做的就是重试或退出。如果您的应用程序将由任何UVC摄像头使用,请购买一个尊重UVC的USB摄像头,并使用它(断开/重新连接)

至于硬件故障,除了设置一个超时,您没有什么可以做的。 您可以在代码中做的是,如果您发现驱动程序存在特定的问题,则避免触发该特定的问题。例如,如果您知道从分辨率x更改为分辨率y会导致相机冻结或驱动程序出错,请避免


但我不会花太多时间去处理你们根本不知道的假想的崩溃。相反,您应该尝试使用错误代码路径。例如,如果系统内存不足,会发生什么情况?或者,如果您的系统负载使您的应用程序无法跟上传入帧的速度。

您的代码现在崩溃的原因是,当驱动程序崩溃时,表示硬件的设备特殊文件消失。您的代码仍然具有这些设备的打开文件句柄。根据您的代码在幕后的具体操作,它可能会尝试向现在无效的文件句柄发出IOCTL,这种用例通常不会被库代码很好地处理,因为它只会发生在这样一个事件中,其中包含某种内核地故障,而用户地代码无论如何都无法处理

如果相机停止工作,处理它与处理司机撞车完全不同。发生故障的摄像头不应关闭(正确写入的)驱动程序。如果驱动程序宕机,您的userland代码对此无能为力。它也不需要这样做。如果司机撞车,那是司机的问题,不是你的问题。如果你有一个经常撞到你的驱动程序,你很想尝试处理它,那么我会选择另一个驱动程序,或者尝试修复你正在使用的驱动程序。再多的应用程序代码也无法修复有故障的驱动程序

不要忘记,您的代码不是使用驱动程序的唯一代码。内部内核进程或其他应用程序也可能使用该驱动程序。如果在拉驱动程序时有其他东西在使用它,则可能会导致其他代码挂起(超出您的控制范围),并可能导致整个系统崩溃

现在,如果您的网络摄像头硬件出现问题,驱动程序应该优雅地给您一条消息或某种类型的错误,您的应用程序代码可以检测到并执行操作,同时执行自己的工作以使摄像头重新工作。失败的硬件不应该对应用程序代码造成负担;让司机完成它的工作,如果可能的话,它会让摄像机恢复在线。如果无法恢复,则相机可能处于不可恢复状态,或者驱动程序有改进的余地(如果是这种情况,则向驱动程序的开发人员提供在硬件上测试其代码有时是为设备获得更好的驱动程序支持的一种快速方法)


与其试图在驱动程序运行时将其撕掉,我会集中精力编写代码来处理驱动程序可以返回到您的设备的所有可能的错误状态。

这是我笔记本电脑上的内置摄像头。谢谢您的解释。因为我的问题目前是理论性的,所以我不会用任何时间去解决它。我将等待,看看是否会有一个真正的问题。我正计划采取的相机下来手动作为根。假设该应用程序在无人机上的计算机上运行。如果相机因某种原因停止工作,则自动尝试重新启动并运行。@Orjanp最后一句话中描述的任务是驾驶员的责任,而不是应用程序代码。用户陆地代码没有执行此操作所需的直接硬件访问权限。如果您的驱动程序没有正确处理硬件错误,请在驱动程序上提交一个bug,或者(如果您勇敢的话)看看是否可以自己修复驱动程序代码。我意识到我的理论方法不是最好的方法。相反,我将看看是否会有真正的问题,并尝试解决它们。谢谢