信号量的测试问题!

发布于 2022-09-18 18:33:10 字数 5334 浏览 11 评论 0

程序的意图测试信号量(一个进程想要获得已经被另一个进程持有的信号量时,该进程应该要挂起,加入到该信号量的等待队列中,当信号量释放后,唤醒进程加入到调度器中运行。)
下面的驱动故意做了一下修改:就是要看程序出现以上的现象。
故意在驱动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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

听风吹 2022-09-25 18:33:10

if(copy_from_user(&signel_buff.arry,buf,count))
          { up(&signel_buff.sem);
      return -EFAULT;
             }
是不是这个有问题?

我只土不豪 2022-09-25 18:33:10

emmoblin

大天使
=======================================
应该不是吧!如果数据写不进去返回地址错误!

你怎么认为是这个原因?

当完成write系统调用时,并没有释放信号量。直接返回一个count值。你说的那个应该没有什么问题!!

苹果你个爱泡泡 2022-09-25 18:33:10

fd=open(DEV_NAME,O_WRONLY);
找到了!就是这个东西!因为,采用了O_WRONLY!应该改成O_RDWR就可以了!
都怪自己懒,把以前的那个只写程序来改的!
真想抽自己耳光!!搞了半天!

谢谢大家的关注!
宣布!

结贴了!

静水深流 2022-09-25 18:33:10

难道你读一个只写方式的文件没有出错提示啊?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文