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

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

我想要python程序来处理它,如果networking摄像机出于某种原因不再工作。 已经testing只卸载模块。 工作正常,如果我只是在运行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)) 

它是http://www.jperla.com/blog/2007/09/26/capturing-frames-from-a-webcam-on-linux/的一个修改版本它使用openvc版本1.x而不是2.x.

任何想法如何使这项工作?

你的意思是USB相机? 我不知道强制卸载模块正在使用,但这不会发生,不是一个很好的模拟相机不工作了。 尝试首先适当地处理相机断开/重新连接。

我不知道你在模拟驱动程序崩溃时想要达到什么样的目的,但是你不能用驱动程序崩溃来处理驱动程序崩溃,这可能导致一个oops或者其他的东西,并且带有用户代码。 一旦内核代码疯狂,没有防御性的编程可以拯救你。

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

至于硬件故障,除了设置超时之外,你可以做的不多。 如果您发现驱动程序存在特定问题,您可以在代码中执行的操作是避免触发此特定问题。 例如,如果您知道从分辨率x到分辨率y的变化会导致冻结照相机或驱动程序哎呀,那就避免它。

但是我不会花费太多的时间来处理你根本不知道的假想的碰撞。 相反,您应该尝试执行错误代码路径。 例如,如果系统内存不足,会发生什么情况? 或者如果你的系统负载是这样的,你的应用程序不能跟上传入的帧。

您的代码现在崩溃的原因是因为当驱动程序崩溃时,代表硬件的设备特殊文件消失。 您的代码仍然对这些设备具有打开的文件句柄。 根据你的代码在幕后做什么,它可能试图发出一个IOCTL到一个现在无效的文件句柄,这个用例通常不是由库代码来处理的,因为它应该只发生在像这样的事件中有一些内核地故障,用户代码无论如何不能做任何事情。

处理相机如果停止工作是完全不同于处理驾驶员碰撞。 发生故障的相机不应该取下(正确写入)的驱动程序。 如果驱动程序出现故障,您的用户代码将无法处理。 也不需要。 如果司机崩溃,那是司机作家的问题,而不是你的。 如果你有一个经常碰到你的驱动程序试图去处理它,那么我会去找一个不同的驱动程序,或者尝试修复你正在使用的驱动程序。 没有大量的应用程序代码将修复一个错误的驱动程序。

不要忘记你的代码不是使用驱动程序的唯一代码。 内部内核进程或其他应用程序也可能正在使用该驱动程序。 如果别的东西在使用驱动程序的时候,你可能会导致其他的代码挂起(超出你的控制),并有可能把整个系统关闭。

现在,如果您的网络摄像头硬件出现问题,那么驱动程序应该优雅地给您提供一条消息或者您的应用程序代码可以检测和执行的错误,同时自行完成相机的工作。 失败的硬件不应该对应用程序代码造成负担; 让司机完成工作,如果可能的话,将使相机恢复在线状态。 如果无法这样做,那么相机处于不可恢复的状态,或者驱动程序有改进的空间(如果是这样的话,向驱动程序开发人员提供在硬件上测试其代码的提议有时可能是一个快速为您的设备获得更好的驱动程序支持的方式)。

在运行驱动程序的时候不要试图把驱动程序撕掉,而是集中精力处理驱动程序可能为设备返回的所有可能的错误状态。

当你尝试在任何进程正在使用的时候删除一个内核驱动程序的时候,Linux真的不喜欢它。 我不确定你的用户级应用程序有什么好的方法来做到这一点(并且让你的应用程序尝试运行'sudo modprobe uvcvideo'已经足够可怕了)。