linux-进程互斥-基于C语言
一、所涉及的系统调用
lockf(files,function,size);
用作锁定文件的某些段或者整个文件。
本函数的头文件为
#include "unistd.h"
参数定义:
int lockf(files,function,size)
int files,function;
long size;
其中:files是文件描述符;function是锁定和解锁:1表示锁定,0表示解锁。size是锁定或解锁的字节数,为0,表示从文件的当前位置到文件尾。
二、参考例程
#include <stdio.h>
#include <unistd.h>
int main() {
int p1, p2, i;
while ((p1 = fork()) == -1); /*创建子进程p1*/
if (p1 == 0) {
lockf(1, 1, 0); /*加锁,这里第一个参数为stdout(标准输出设备的描述符)*/
for (i = 0; i < 10; i++)
printf("daughter %d\n", i);
lockf(1, 0, 0); /*解锁*/
} else {
while ((p2 = fork()) == -1); /*创建子进程p2*/
if (p2 == 0) {
lockf(1, 1, 0); /*加锁*/
for (i = 0; i < 10; i++)
printf("son %d\n", i);
lockf(1, 0, 0); /*解锁*/
} else {
lockf(1, 1, 0); /*加锁*/
for (i = 0; i < 10; i++)
printf(" parent %d\n", i);
lockf(1, 0, 0); /*解锁*/
}
}
return 0;
}
三、运行结果
parent…
son…
daughter..
daughter..
或
parent…
son…
parent…
daughter…
四、分析原因
上述程序执行时,不同进程之间存在共享临界资源问题。