#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;
}