课后思考题:
① 如果多个用户对一个文件进行操作的时候,如何解决,考虑用文件锁的形式和多路复用形式
当多个用户对文件操作时,用户是不允许同时对进行修改。因此这里就需要用到文件锁来保证文件的安全性。
a.协同锁
协同锁要求参与操作的进程之间协同合作。只有当参与操作的进程是协同合作的时候,协同锁才能发挥作用。协同锁有时也被称为“非强制”锁。
b.强制锁
强制锁不需要参与操作的进程之间保持协同合作。它利用内核来查检每个打开、读取、写入操作,从而保证在调用这些操作时不违反文件上的锁规则。
为了使能Linux中的强制锁功能,你需要在文件系统级别上打开它,同时在单个文件上打开它。
//#include < s tdio.h>
//#include < stdlib.h>
//#include < sys/types.h>
//#include < sys/stat.h>
//#include < fcntl.h>
//#include < wait.h>
//#include < unistd.h>
int main()
{
int fd;
pid_t pid;
fd = open("flock.txt",O_RDWR|O_CREAT|O_TRUNC, 0644);
if(fd < 0)
{
perror("open error!");
exit(1);
}
if(flock(fd,LOCK_EX) < 0)
{
perror("flock()");
exit(1);
}
printf("A:%d: locked!\n",getpid());
pid = fork();
if(pid < 0)
{
perror("fork()");
exit(1);
}
if(pid == 0)
{
/**/fd = open("flock.txt",O_RDWR|O_CREAT|O_TRUNC, 0644);
if(pid < 0)
{
perror("open()");
exit(1);
}/**/
if(flock(fd, LOCK_EX) < 0)
{
perror("flock()");
exit(1);
}
printf("B:%d: locked:\n",getpid());
exit(0);
}
wait(NULL);
return 0;
}
② 在Linux中写一个程序,里面全局变量,局部变量,static,const,常数,数组,输出这些变量的地址(包括赋值的和没有赋值的,各类数据类型)
//#include < stdio.h>
int a;
int b = 1;
int const c = 2;
static int d;
static int e = 3;
char src1[10];
char dest1[] = {‘4’,’5’};
int main()
{
int f;
int g = 1;
int const h = 2;
static int i;
static int j = 3;
char src2[10];
char dest2[] = {'4','5'};
printf("未初始化的全局变量 %p\n",&a);
printf("初始化的全局变量 %p\n",&b);
printf("常全局变量 %p\n",&c);
printf("未初始化的静态全局变量 %p\n",&d);
printf("初始化的静态全局变量 %p\n",&e);
printf("未初始化的全局数组 %p\n",src1);
printf("初始化的全局数组 %p\n",dest1);
printf("未初始化的局部变量 %p\n",&f);
printf("初始化的局部变量 %p\n",&g);
printf("常局部变量 %p\n",&h);
printf("未初始化的静态局部变量 %p\n",&i);
printf("初始化的静态局部变量 %p\n",&j);
printf("未初始化的局部数组 %p\n",src2);
printf(“初始化的局部数组 %p\n”,dest2);
}
结果:
未初始化的全局变量 0x80498d0
初始化的全局变量 0x80498a4
常全局变量 0x80485a0
未初始化的静态全局变量 0x80498c0
初始化的静态全局变量 0x80498a8
未初始化的全局数组 0x80498c4
初始化的全局数组 0x80498ac
未初始化的局部变量 0xbff1d730
初始化的局部变量 0xbff1d72c
常局部变量 0xbff1d728
未初始化的静态局部变量 0x80498bc
初始化的静态局部变量 0x80498b0
未初始化的局部数组 0xbff1d71e
初始化的局部数组 0xbff1d71c
//