读书笔记:第9章 记录上锁 (1)

《UNIX网络编程:卷2》P155-P156:图9-2

不上锁的加1测试

--------------------------------------------

/*
 * lockmain.c
 * 图9-2 文件上锁例子的main函数
 */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>

#define FILE_MODE	(S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
#define MAXLINE 1024
#define SEQFILE	"seqno"

void my_lock(int fd);
void my_unlock(int fd);

int main(int argc, char *argv[])
{
	int			fd;
	long		i, seqno;
	pid_t		pid;
	ssize_t		n;
	char		line[MAXLINE + 1];

	pid = getpid();					// 获取进程ID
	// 打开文件
	if ((fd = open(SEQFILE, O_RDWR, FILE_MODE)) < 0) {
		fprintf(stderr, "open %s error: %s\n",  SEQFILE, strerror(errno));
		exit(1);
	}

	for (i = 0; i < 20; i++) {
		my_lock(fd);									// 锁定文件

		lseek(fd, 0L, SEEK_SET);						//定位到文件开始位置
		if ((n = read(fd, line, MAXLINE)) < 0) {		// 读取一行
			fprintf(stderr, "read error: %s\n", strerror(errno));
			exit(1);
		}
		line[n] = '\0';

		n = sscanf(line, "%ld\n", &seqno);				// 将字符转换成数字
		printf("%s: pid = %d, seq# = %ld\n", argv[0], pid, seqno);

		seqno++;										// 加1

		snprintf(line, sizeof(line), "%ld\n", seqno);	// 将数字写回缓冲区
		lseek(fd, 0L, SEEK_SET);						// 定位到文件开始处
		if (write(fd, line, strlen(line)) < 0) {		// 将缓冲区内容写回文件
			fprintf(stderr, "write error: %s\n", strerror(errno));
			exit(1);
		}

		my_unlock(fd);				// 解锁文件
	}
	exit(0);
}

/*
 * locknone.c
 * P155 图9-1 不上锁的函数
 */
void my_lock(int fd)
{
	return;		// 不做任何事情,直接返回
}

void my_unlock(int fd)
{
	return;		// 不做任何事情,直接返回
}

--------------------------------------------

创建文件seqno,并写入1。运行程序:

$ ./locknone & ./locknone &
[1] 2805
[2] 2806
$ ./locknone: pid = 2806, seq# = 1
./locknone: pid = 2806, seq# = 2
./locknone: pid = 2806, seq# = 3
./locknone: pid = 2806, seq# = 4
./locknone: pid = 2806, seq# = 5
./locknone: pid = 2806, seq# = 6
./locknone: pid = 2806, seq# = 7
./locknone: pid = 2806, seq# = 8
./locknone: pid = 2806, seq# = 9
./locknone: pid = 2806, seq# = 10
./locknone: pid = 2806, seq# = 11
./locknone: pid = 2806, seq# = 12
./locknone: pid = 2806, seq# = 13
./locknone: pid = 2806, seq# = 14
./locknone: pid = 2806, seq# = 15
./locknone: pid = 2806, seq# = 16
./locknone: pid = 2805, seq# = 15		开始出错了
./locknone: pid = 2806, seq# = 17
./locknone: pid = 2806, seq# = 18
./locknone: pid = 2806, seq# = 19
./locknone: pid = 2805, seq# = 19
./locknone: pid = 2806, seq# = 20
./locknone: pid = 2805, seq# = 20
./locknone: pid = 2805, seq# = 21
./locknone: pid = 2805, seq# = 22
./locknone: pid = 2805, seq# = 23
./locknone: pid = 2805, seq# = 24
./locknone: pid = 2805, seq# = 25
./locknone: pid = 2805, seq# = 26
./locknone: pid = 2805, seq# = 27
./locknone: pid = 2805, seq# = 28
./locknone: pid = 2805, seq# = 29
./locknone: pid = 2805, seq# = 30
./locknone: pid = 2805, seq# = 31
./locknone: pid = 2805, seq# = 32
./locknone: pid = 2805, seq# = 33
./locknone: pid = 2805, seq# = 34
./locknone: pid = 2805, seq# = 35
./locknone: pid = 2805, seq# = 36
./locknone: pid = 2805, seq# = 37

[1]-  完成                  ./locknone
[2]+  完成                  ./locknone

你可能感兴趣的:(读书笔记,《UNIX网络编程》)