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…

四、分析原因

上述程序执行时,不同进程之间存在共享临界资源问题。

posted @ 2020-08-11 22:06  漫漫长夜何时休  阅读(616)  评论(0编辑  收藏  举报