linux锁的应用
学过操作系统的人知道有一个非常著名的问题:读者-写者问题。读者-写者问题是指系统当中的的资源在某一时间里可以同时允许多个进程读,但只允许一个进程写。这个进程同步问题的解法有许多种,在window系统里用互斥变量来进行进程的同步。在Linux里有另一种方法,那就是文件锁,文件锁里的文件不单单只指平时所说的文件它应包涵更广泛的含意。即也指系统所有可以访问的系统资源。可以给文件加读锁,也可以给文件加写锁,一个进程给一个文件加读锁后其他的进程也可以给这个文件加读锁,但是不可以给这个文件加写锁,直到给这个文件加读锁的所有进程都Release了它自己所加的锁后才可以。如果一个进程给一个文件加写锁后,不允许其它进程对这个文件加任何的锁。下面是锁的具体应用。/
其中用到了多个系统函数:fcntl(),getpid(),getchar,open(),flock,read(),write()。
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<string.h>
int lock_set(int fd,struct flock *lock)
{
if(fcntl(fd,F_SETLK,lock)==0)
{
if(lock->l_type==F_RDLCK)
printf("set read lock,pid:%d\n",getpid());
else if(lock->l_type==F_WRLCK)
printf("set write lock,pid:%d\n",getpid());
else if(lock->l_type=F_UNLCK)
printf("release lock,pid:%d\n",getpid());
}
else
{
printf("set lock operatiion fail\n");
return -1;
}
return 0;
}
int lock_test(int fd,struct flock *lock)
{
if(fcntl(fd,F_GETLK,lock)==0)
{
if(lock->l_type==F_UNLCK)
printf("lock can be set by fd\n");
else{
if(lock->l_type=F_RDLCK)
printf("can't set lock,read lock can be set by:%d\n",lock->l_pid);
el
相关文档:
如果你既没做系统启动软盘,同时多系统的引导LILO 和GRUB 又被删除,那么只能使用Linux 系统安装盘来恢复root的密码,步骤如下。 一. lilo引导在出现 lilo: 提示时键入 linux single Boot: linux single 回车可直接进入linux单用户模式 vi /etc/passwd 删除root项中的密码 (这里也可以直接使用passwd命令重新设置root的密码 ......
这部分能用本着想记就就记,想不起来就不记的原则。同是出于练习英文的目的,部分不重要内容计划用英文。
事先说明我读的是linux1.0,这里可以几乎不用怎么看到lock 前缀,都是单cpu,同时有引导程序。 首先说明cpu为什么会运转起来:
1:cpu上电后会从某一个地址开始顺序执行程序,当然此时是实模式(如果问什么是实模 ......
由于 fc3 内核默认 fat32 文件系统字符编码是 ascii,如果优盘的文件名包含中文,那么在转换时会出问题,应用程序就会失去响应。具体的表现有多种,比如桌面假死,关机时提示无法卸载分区等等
解决的办法是在挂载时,根据语言环境 locale 的值,使用挂载参数。如果是 UTF- ......
原理:使用Windows下的连接作为网关。Linux作为一个虚拟的客户端通过这个Windows下的连接连上网。 1、设置Windows下的本地连接答应VMware的虚拟网卡来共享上网。(很重要!) 2、设置Windows下的VMware产生的虚拟网卡1。将其IP设置为192.168.0.1。子网掩码为255.255.255.0。 3、设置VMware的网卡为Host-only 4、启动L ......
1. I/O Port
和硬件打交道离不开I/O Port,老的ISA设备经常是占用实际的I/O端口,在linux下,操作系统没有对I/O口屏蔽,也就是说,任何驱动程序都可对任意的I/O口操作,这样就很容易引起混乱。每个驱动程序应该自己避免误用端口。
有两个重要的kernel函数可 ......