试图在Linux上密切关注

试图在Linux上密切关注,第1张

概述我需要在信号处理程序(有或没有SA_RESTART)中断关闭的情况下,调查/测试 Linux上某些代码的行为.什么是最方便的设置,使密切的系统调用睡眠在一个可测量的时间窗口,在此期间我可以尝试用信号命中过程?一些想法: >故意缓慢/无响应的NFS安装 >自定义FUSE驱动程序 但是由于这些设置有点痛苦,我想知道是否有更多现成的我可以使用它可以提供所需的行为. 如果没有其他人有更好的主意…… 您可以 我需要在信号处理程序(有或没有SA_RESTART)中断关闭的情况下,调查/测试 Linux上某些代码的行为.什么是最方便的设置,使密切的系统调用睡眠在一个可测量的时间窗口,在此期间我可以尝试用信号命中过程?一些想法:

>故意缓慢/无响应的NFS安装
>自定义FUSE驱动程序

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

解决方法 如果没有其他人有更好的主意……

您可以实现自己的角色设备驱动程序.从Linux Device Drivers (3rd edition)第3章的模板开始,调整它除了在close()上暂停一段时间外什么都不做. (您可以使用第7章中的msleep或msleep_interruptible进行阻止.)

实际上,如果没有其他人建议其他东西,我可以通过调整我现有的一些代码来快速推动这一点.你多久需要它?

[编辑]

好的,试试这个……

Makefile文件:

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

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 <[email protected]>");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 *,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 __initmy_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",err);    return err;}intmy_open(struct inode *inode,struct file *filp){    return 0;}ssize_tmy_read(struct file *file,char __user *p,size_t n,loff_t *off) {    return 0;}ssize_tmy_write(struct file *file,const char __user *p,loff_t *off) {    return n;}intmy_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 __exitmy_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表示要使用的major:minor.)

读写工作类似/ dev / null;即任何读取的EOF,任何写入的成功.

我已经验证了“cat< / dev / closer”在close()中阻塞了10秒.我还没有创建一个测试来捕获SIGINT(或其他),并验证它实际上是否导致了EINTR. 针对2.6.32内核构建.让我知道它对你有用.

总结

以上是内存溢出为你收集整理的试图在Linux上密切关注全部内容,希望文章能够帮你解决试图在Linux上密切关注所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/1039898.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存