[操作系统自由练习] 进程的同步,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(1, 1, 0) 锁定的屏幕的输出, 其他进程此时无法输出
lockf(1, 0, 0)解锁屏幕输出
lockf()
函数原型
int lockf(int fd, int cmd, off_t len);
-
fd为通过open返回的打开文件描述符。
-
cmd的取值为:
-
F_LOCK:给文件互斥加锁,若文件以被加锁,则会一直阻塞到锁被释放。
-
F_TLOCK:同F_LOCK,但若文件已被加锁,不会阻塞,而回返回错误。
-
F_ULOCK:解锁。
-
F_TEST:测试文件是否被上锁,若文件没被上锁则返回0,否则返回-1。
-
-
len:为从文件当前位置的起始要锁住的长度。
✨可见进程终止时,他所建立的所有文件锁都会被释放(虽然子进程没解锁, 但是父进程最后还是完成输出操作)
参考
本文来自博客园,作者:泥烟,CSDN同名, 转载请注明原文链接:https://www.cnblogs.com/Knight02/p/16255355.html