[操作系统自由练习] 进程的同步,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
分类:
操作系统
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY