目录
例一
?
分析
例二
分析
lockf()
参考
例一
#include<stdio.h> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
#include<unistd.h>
?
{
? ?int p1, p2, i;
? ?while((p1=fork())==-1);
? ?if(p1 == 0){
? ? ? ?printf("1, pid=%d\n", getpid());
? ? ? ?for(int i = 0; i < 10; i ++)
? ? ? ? ? ?printf("daughter\n");
? }else{
? ? ? ?while((p2=fork())==-1);
? ? ? ?if(p2 == 0){
? ? ? ? ? ?printf("2, pid=%d\n", getpid());
? ? ? ? ? ?for(int i = 0; i < 10; i ++)
? ? ? ? ? ? ? ?printf("son\n");
? ? ? }else{
? ? ? ? ? ?printf("0, pid=%d\n", getpid());
? ? ? ? ? ?for(int i = 0; i < 10; i ++)
? ? ? ? ? ? ? ?printf("parent\n");
? ? ? }
? }
? ?return 0;
}
?
分析
(图一)父进程(pid=51446)先后创建子进程1(pid=51447)和子进程2(pid=51448)
分别输出了 parent, daughter, son
并且在他们各自输出的时候, IO这一资源对于三个进程均可用, 多次运行该程序会看到如下交替输出的情况
?
例二
#include<stdio.h>
#include<unistd.h> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
main() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ?int p1, p2, i; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ?while((p1=fork())==-1); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ?if(p1 == 0){
? ? ? ?lockf(1, 1, 0);//加锁
? ? ? ?printf("1, pid=%d\n", getpid());
? ? ? ?for(int i = 0; i < 10; i ++)
? ? ? ? ? ?printf("daughter\n");
? ? ? ?lockf(1, 0, 0);
? }else{
? ? ? ?while((p2=fork())==-1);
? ? ? ?if(p2 == 0){
? ? ? ? ? ?lockf(1, 1, 0);
? ? ? ? ? ?printf("2, pid=%d\n", getpid());
? ? ? ? ? ?for(int i = 0; i < 10; i ++)
? ? ? ? ? ? ? ?printf("son\n");
? ? ? ? ? ?lockf(1, 0, 0);
? ? ? }
? }
}
?
分析
父进程(pid=51716)先后创建子进程1(pid=51717)和子进程2(pid=51718)
与例一不同的是, 这里使用了lockf(), 对IO加锁, 不会再出现交替输出的情况, 实现互斥
lockf()
函数原型
int lockf(int fd, int cmd, off_t len);
-
cmd的取值为:
-
F_LOCK:给文件互斥加锁,若文件以被加锁,则会一直阻塞到锁被释放。 -
F_TLOCK:同F_LOCK,但若文件已被加锁,不会阻塞,而回返回错误。 -
F_ULOCK:解锁。 -
F_TEST:测试文件是否被上锁,若文件没被上锁则返回0,否则返回-1。
?
?可见进程终止时,他所建立的所有文件锁都会被释放(虽然子进程没解锁, 但是父进程最后还是完成输出操作)
参考
>>>linux中fcntl()、lockf、flock的区别-lvyilong316-ChinaUnix博客
|