试图在Linux上closures睡眠

我需要在信号处理程序(有或没有SA_RESTART )可能中断close情况下,调查/testingLinux上某些代码的行为。 什么是最方便的设置,使我可以尝试用一个信号来触发这个过程,在一个可测量的时间窗口内进行系统睡眠的hibernate? 一些想法:

  • 故意缓慢/无响应的NFS挂载
  • 自定义FUSE驱动程序

但是,由于这些设置有点痛苦,我想知道是否有更多的现成的我可以使用,可以给予所需的行为。

Solutions Collecting From Web of "试图在Linux上closures睡眠"

如果没有其他人有更好的想法…

你可以实现你自己的字符设备驱动程序。 从Linux设备驱动程序(第3版)第3章的模板开始,调整它在close()上除了block之外什么也不做。 (可以使用第7章中的msleepmsleep_interruptible来进行阻塞。)

其实,如果别人没有其他建议,我可以通过调整现有的一些代码来很快地实现这个目标。 你多久需要它?

[编辑]

好的,试试这个…

Makefile文件:

 ifneq ($(KERNELRELEASE),) obj-m := closer.o else KERNELDIR ?= /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: modules %: $(MAKE) -C $(KERNELDIR) M=$(PWD) "$@" .PHONY: default endif 

closer.c:

 #include <linux/init.h> #include <linux/module.h> #include <linux/miscdevice.h> #include <linux/delay.h> #include <linux/fs.h> MODULE_DESCRIPTION("Block-on-close driver"); MODULE_AUTHOR("Nemo <nemo@self-evident.org>"); MODULE_LICENSE("GPL"); #define VERSION "20110705" MODULE_VERSION(VERSION); #define MY_NAME "closer" int my_open(struct inode *, struct file *); int my_release(struct inode *, struct file *); ssize_t my_read(struct file *, char __user *, size_t, loff_t *); ssize_t my_write(struct file *, const char __user *, size_t, loff_t *); static struct file_operations my_fops = { .owner = THIS_MODULE, .open = my_open, .read = my_read, .write = my_write, .release = my_release, }; static struct miscdevice my_dev; int __init my_init(void) { int err = 0; printk(KERN_INFO "%s: loading version %s\n", MY_NAME, VERSION); my_dev.minor = MISC_DYNAMIC_MINOR; my_dev.name = MY_NAME; my_dev.fops = &my_fops; err = misc_register(&my_dev); if (err) printk(KERN_ERR "%s: misc_register failed, error %d\n", MY_NAME, err); return err; } int my_open(struct inode *inode, struct file *filp) { return 0; } ssize_t my_read(struct file *file, char __user *p, size_t n, loff_t *off) { return 0; } ssize_t my_write(struct file *file, const char __user *p, size_t n, loff_t *off) { return n; } int my_release(struct inode *inode, struct file *filp) { int err = 0; /* 10 second sleep, interruptible. */ if (msleep_interruptible(10 * 1000) > 0) err = -EINTR; return err; } void __exit my_exit(void) { misc_deregister(&my_dev); printk(KERN_INFO "%s: unloaded\n", MY_NAME); } module_init(my_init); module_exit(my_exit); 

使用“insmod closer.o”加载模块。 如果你有一个合理的现代/完整的Linux环境,udev会自动唤醒并产生/ dev / close。 如果没有,您可以自己创建设备节点:

 mknod /dev/closer c `tr : ' ' </sys/class/misc/closer/dev` 

(也就是说,/ sys / class / misc / closer / dev表示主要:使用minor。)

读写工作如/ dev / null; 即任何读取时的EOF,任何写入都成功。

我已经验证了“cat </ dev / closer”在close()封锁了10秒钟。 我还没有创建一个测试来捕获SIGINT (或其他),并验证它实际上导致EINTR

针对2.6.32内核构建。 让我知道它是如何为你工作的。