利用文件锁控制程序的执行

      我们在写程序的时候,需要同步控制的时候往往利用线程锁对程序进行加锁控制,哈哈,昨天看《UNIX网络编程》,里面提到对程序可以利用文件锁进行程序控制,觉得挺有意思,就拿过来试试。

      首先,我们需要知道一个库函数和一个结构体:fcntl,struct flock,没错,函数的意思就是文件控制,结构体的意思是文件锁结构。由于,之前看到过这两个东西,网上的介绍也很多,在这里就不多做介绍了,不懂的同学百度或者谷歌一下吧,在这里,提供一段测试程序,加锁,解锁的思想来自《Unix 网络编程》

/*利用文件给程序加锁*/

#include <unistd.h>
#include <sys/file.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

static struct flock lock_it, unlock_it;

static int lock_fd = -1;

void dlut_lock_init(char *);
void dlut_lock_wait();
void dlut_lock_release();

int main(int argc, char **argv, char **environ)
{
	dlut_lock_init("test.XXXXXX");

	dlut_lock_wait();

	if (!fork())
	{
		dlut_lock_wait();

		printf("hello, this is child %d\n", getpid());

		sleep(3);

		dlut_lock_release();

		exit(0);
	}

	printf("hello, this is parent %d\n", getpid());

	dlut_lock_release();

	sleep(1);

	return 0;
}

void dlut_lock_init(char *path_name)
{
	char lock_file[1024];

	char file_name[1024];

	strcpy(lock_file, path_name);

	strcpy(file_name, mktemp(lock_file));

	lock_fd = open(file_name, O_RDWR | O_CREAT, 0666);

	unlink(lock_file);

	lock_it.l_type = F_WRLCK;
	lock_it.l_whence = SEEK_SET;
	lock_it.l_start = 0;
	lock_it.l_len = 0;

	unlock_it.l_type = F_UNLCK;
	unlock_it.l_whence = SEEK_SET;
	unlock_it.l_start = 0;
	unlock_it.l_len = 0;
}

void dlut_lock_wait()
{
	int rc;

	while ((rc = fcntl(lock_fd, F_SETLKW, &lock_it)) < 0)
	{
		if (errno == EINTR)
			continue;
		else
		{
			perror("fcntl error...");

			exit(1);
		}
	}

	return;
}

void dlut_lock_release()
{
	if (fcntl(lock_fd, F_SETLKW, &unlock_it))
	{
		perror("fcntl error");

		exit(2);
	}

	return;
}

      我的意思是,父进程首先获取文件锁,之后打印一行字,接着子进程才能打印一行字。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值