Record locking

8 篇文章 0 订阅
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <fcntl.h>

#define	MAXLINE	4096
#define	SEQFILE	"seqno"

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

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

	pid = getpid();
	fd = open(SEQFILE, O_RDWR);
	
	for (i = 0; i < 20; i++) {
		my_lock(fd);
		
		lseek(fd, 0L, SEEK_SET);	
		n = read(fd, line, MAXLINE);
		line[n] = '\0';
		
		n = sscanf(line, "%ld\n", &seqno);
		printf("%s: pid = %ld, seq# = %ld\n", argv[0], (long)pid, seqno);
		
		seqno++;

		snprintf(line, sizeof(line), "%ld\n", seqno);
		lseek(fd, 0L, SEEK_SET);	
		write(fd, line, strlen(line));

		my_unlock(fd);
	}
	exit(0);
}

void	
my_lock(int fd) {
	struct flock lock;

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

	fcntl(fd, F_SETLKW, &lock);
}

void 
my_unlock(int fd) {
	struct flock lock;

	lock.l_type = F_UNLCK;
	lock.l_whence = SEEK_SET;
	lock.l_start = 0;
	lock.l_len = 0;

	fcntl(fd, F_SETLK, &lock);
}

sscanf用法如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
	char str[100];
	//用法一:取指定长度的字符串
	sscanf("12345","%4s",str);
	printf("用法一\nstr = %s\n",str);

	//用法二:格式化时间
	int year,month,day,hour,minute,second;
	sscanf("2013/02/13 14:55:34", "%d/%d/%d %d:%d:%d",
                &year, &month, &day, &hour, &minute, &second);
	printf("用法二\ntime = %d-%d-%d %d:%d:%d\n", year, month, day, hour, minute, second);

	//用法三:读入字符串
	sscanf("12345","%s", str);
	printf("用法三\nstr = %s\n", str);

	//用法四:%*d 和 %*s 加了星号 (*) 表示跳过此数据不读入. (也就是不把此数据读入参数中)
	sscanf("12345acc","%*d%s", str);
	printf("用法四\nstr = %s\n", str);

	//用法五:取到指定字符为止的字符串。如在下例中,取遇到'+'为止字符串。
	sscanf("12345+acc","%[^+]", str);
	printf("用法五\nstr = %s\n", str);

	//用法六:取到指定字符集为止的字符串。如在下例中,取遇到小写字母为止的字符串。
	sscanf("12345+acc121","%[^a-z]", str);
	printf("用法六\nstr = %s\n", str);

	return 0;
}

snprintf用法如下: http://blog.csdn.net/crfoxzl/article/details/2062139

#include <stdio.h>
#include <stdlib.h>
/*
 * int snprintf(char *restrict buf, size_t n, const char * restrict  format, ...);
 * 函数说明:最多从源串中拷贝n-1个字符到目标串中,然后再在后面加一个0。所以如果目标串的大小为n 的话,将不会溢出。
 * 函数返回值:若成功则返回欲写入的字符串长度,若出错则返回负值。
 */
int main()
{
	char str1[10] = { 0, };
	char str2[10] = { 0, };
	int ret1 = 0, ret2 = 0;
	ret1 = snprintf(str1, sizeof(str1), "%s", "abc");
	ret2 = snprintf(str2, 4, "%s", "aaabbbccc");
	printf("aaabbbccc length = %d\n", strlen("aaabbbccc"));
	printf("str1 = %s,ret1 = %d\n", str1, ret1);
	printf("str2 = %s,ret2 = %d\n", str2, ret2);

	char dst1[10] = { 0, }, dst2[10] = { 0, };
	char src1[10] = "aaa", src2[15] = "aaabbbcccddd";
	int size = sizeof(dst1);
	ret1 = 0, ret2 = 0;
	ret1 = snprintf(dst1, size, "str :%s", src1);
	ret2 = snprintf(dst2, size, "str :%s", src2);
	printf("sizeof(dst1) = %d, src1 = %s, \"str:%%s\" = %s%s, dst1 = %s, ret1 = %d\n", 
                sizeof(dst1), src1, "str:", src1, dst1, ret1);
	printf("sizeof(dst2) = %d, src2 = %s, \"str:%%s\" = %s%s, dst2 = %s, ret2 = %d\n", 
                sizeof(dst2), src2, "str:", src2, dst2, ret2);

	char test[8];
	int ret = snprintf(test, 5, "1234567890");
	printf("%d|%s\n", ret, test);

	return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值