信号量的测试问题!
程序的意图测试信号量(一个进程想要获得已经被另一个进程持有的信号量时,该进程应该要挂起,加入到该信号量的等待队列中,当信号量释放后,唤醒进程加入到调度器中运行。)
下面的驱动故意做了一下修改:就是要看程序出现以上的现象。
故意在驱动write中不把信号量释放,让当子进程read时,应该是要挂起的!
可是并没有挂起,而是把数据读出来了,程序顺利的完成了,就像没有正常的一样!如果把子进程read改成write时,就可以.这为什么?是不是fork()的原因?
前辈给指教一下!
以下为DOME:
#include <stdio.>
#include <fcntl.h>
#include <unistd.h>
#define DEV_NAME "/dev/signel"
int main()
{ int fd,ret,arry;
arry=100;
fd=open(DEV_NAME,O_WRONLY);
if(fd<0)
{ printf("the file is opened to fail!!&fd=%d\n",fd);
}
else
{ printf("the file is opened to scuss!!&fd=%d\n",fd);
printf("the data(arry)=%d will is writing in driver\n",arry);
write(fd,&arry,sizeof(arry)); /*当此处获得信号量,末释放,下面的进程来访问共享资源时,进程被挂起*/
if(fork()==0)
{ read(fd,&arry,sizeof(arry));
printf("read got the data---arry=%d\n",arry);
exit(0);
}
}
ret=close(fd);
if(ret<0)
{ printf("the file is closed to fail!!&ret=%d\n",ret);
}
else
{ printf("the file is close to scuss!!&ret=%d\n",ret);
}
exit(1);
}
以下为驱动:
#define DEV_NAME "signel"
#define DEV_ID 110
struct signel {
static int arry;
struct semaphore sem;
}signel_buff;
static int signel_write(struct file *file,const char __user * buf,size_t count,loff_t *off)
{ printk("%i,%s\n",current->pid,current->comm);
if(down_interruptible(&signel_buff.sem))
{ return -ERESTARTSYS;
}
printk("write data....!!!\n");
if(copy_from_user(&signel_buff.arry,buf,count))
{ up(&signel_buff.sem);
return -EFAULT;
}
up(&signel_buff.sem); 当数据写完,故意把这条语句删了(不释放信号量)!就是要检测信号量挂起的目的.
return count;
}
static int signel_read(struct file *file,char __user * buf,size_t count,loff_t *off)
{ printk ("%i,%s\n",current->pid,current->comm);
if(down_interruptible(&signel_buff.sem))
{ return -ERESTARTSYS;
}
flags=0;
printk("read data....!!!\n");
if(copy_to_user(buf,&signel_buff.arry,count))
{ up(&signel_buff.sem);
return -EFAULT;
}
up(&signel_buff.sem);
return count;
}
static struct file_operations signel_test = {
.write = signel_write,
.read = signel_read,
};
static int __init init_signel(void)
{ int ret;
sema_init(&signel_buff.sem,1);
ret=register_chrdev(DEV_ID,DEV_NAME,&signel_test);
if(ret<0)
{ printk("registre is fail!!\n");
return ret;
}
else
{ printk("registre is scuss!!\n");
devfs_mk_cdev(MKDEV(DEV_ID,0),S_IFCHR | S_IRUSR | S_IWUSR,"signel");
return 0;
}
return 0;
}
static void __exit exit_signel(void)
{ unregister_chrdev(DEV_ID,DEV_NAME);
devfs_remove(DEV_NAME);
}
module_init(init_signel);
module_exit(exit_signel);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("KANG");
MODULE_DESCRIPTION("SIGNE");
[ 本帖最后由 shuiyu123 于 2009-3-31 11:38 编辑 ]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
if(copy_from_user(&signel_buff.arry,buf,count))
{ up(&signel_buff.sem);
return -EFAULT;
}
是不是这个有问题?
emmoblin
大天使
=======================================
应该不是吧!如果数据写不进去返回地址错误!
你怎么认为是这个原因?
当完成write系统调用时,并没有释放信号量。直接返回一个count值。你说的那个应该没有什么问题!!
fd=open(DEV_NAME,O_WRONLY);
找到了!就是这个东西!因为,采用了O_WRONLY!应该改成O_RDWR就可以了!
都怪自己懒,把以前的那个只写程序来改的!
真想抽自己耳光!!搞了半天!
谢谢大家的关注!
宣布!
结贴了!
难道你读一个只写方式的文件没有出错提示啊?