比如 read passwd,用户输入的就可用$passwd调用
你的脚本很乱,记得搞清楚你到底要实现什么
下面的例子使用mmap读最后20行(假设最后20行不会超过1024字节)/*-
* Copyright (C), 1988-2014, mymtom
*
* vi:set ts=4 sw=4:
*/
#ifndef lint
static const char rcsid[] = "$Id$"
#endif /* not lint */
/**
* @filelast20.c
* @brief
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <unistd.h>
#include <limits.h>
#include <stdio.h>
#include <string.h>
char *memchrr(const void *v1, const char *v2, int c)
{
char *s1, *s2
char *p
s1 = (char *)v1
s2 = (char *)v2
for (p = s2p >= s1--p) {
if (*p == c)
return p
}
return NULL
}
#define READSIZE1024
int main(int argc, char *argv[])
{
int ret
FILE *fp
char *addr
size_t len
int prot
int flags
int fd
off_t off
off_t rem
long pagesize
struct stat buf
pagesize = sysconf(_SC_PAGESIZE)
fp = fopen("last20.c", "rb")
fd = fileno(fp)
ret = fstat(fd, &buf)
if (buf.st_size <= READSIZE || buf.st_size <= pagesize) {
off = 0
len = buf.st_size
} else {
off = buf.st_size - READSIZE
rem = off % pagesize
off = off - rem
len = READSIZE + rem
}
/*
printf("size=%d READSIZE=%d off=%d len=%d\n",
(int)buf.st_size, (int)READSIZE, (int)off, (int)len)
*/
prot = PROT_READ
flags = MAP_PRIVATE
addr = mmap(NULL, len, prot, flags, fd, off)
fclose(fp)
{
int i, n
char *head, *tail
size_t size
char line[1024]
tail = addr + len - 1
n = 20
for (i = 0i <n++i) {
head = memchrr(addr, tail - 1, '\n')
if (head == NULL) {
size = tail - addr
memcpy(line, addr, size)
line[size] = '\0'
} else {
size = tail - head - 1
memcpy(line, head + 1, size)
line[size] = '\0'
tail = head
}
printf("%s\n", line)
if (head == NULL) {
break
}
}
}
munmap(addr, len)
return 0
}
运行结果为:
./last20 | tac | cat -n
line[size] = '\0'
} else {
size = tail - head - 1
memcpy(line, head + 1, size)
line[size] = '\0'
tail = head
}
printf("%s\n", line)
if (head == NULL) {
break
}
}
}
munmap(addr, len)
return 0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)