[英]How do I see current seek position of an open file descriptor?
我在 100G+ 文件上运行 awk 脚本。 我怀疑因为它永远不会完成它进入某种无限循环。
我想查看脚本当前所在的行,看看数据是否有问题。
我试过ls -l /proc/<pid>/fd
但它只列出了打开文件的名称。
有没有办法找到打开文件的当前seek
position?
这里的想法是使用strace -p <your pid>
来观察正在运行的pid
。 创建gawk
的扩展以从 awk 脚本调用lseek
。 lseek
按照您的要求报告文件描述符偏移量。
您需要修改 awk 脚本来调用扩展。
在不修改 awk 脚本的情况下, strace -p <your pid>
将报告大量read
调用,这通常表明输入文件的进度。
下面是 Makefile 创建lseek
扩展并运行快速测试。
CC = gcc
CFLAGS = -Wall -fPIC -c -O2 -DHAVE_STRING_H -DHAVE_SNPRINTF -DHAVE_STDARG_H -DHAVE_VPRINTF -DDYNAMIC
LDFLAGS = -shared
all: awklseek.so
gawk -l ./awklseek.so 'BEGIN{ print lseek() } { print $$0 ; lseek() ; } ' data
awklseek.so: lseek.o
${CC} $^ -o $@ ${LDFLAGS}
c.o:
${CC} ${CFLAGS} $<
.PHONY:clean
clean:
rm awklseek.so lseek.o
这是扩展名:
/*
* lseek.c - Provide an interface to lseek(2) routine
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include "gawkapi.h"
static const gawk_api_t *api;
static awk_ext_id_t ext_id;
static const char *ext_version = "lseek extension: version 1.0";
static awk_bool_t init_lseek(void);
static
awk_bool_t(*init_func) (void)= init_lseek;
int plugin_is_GPL_compatible;
/* do_lseek --- implement the lseek interface */
static awk_value_t *
do_lseek (int nargs, awk_value_t * result, struct awk_ext_func *unused)
{
awk_bool_t api_result;
const awk_input_buf_t *ibuf;
const awk_output_buf_t *obuf;
//GET FILE DESCRIPTOR FOR CURRENT INPUT FILE
api_result = api->api_get_file(ext_id, NULL, 0, "<", 0, &ibuf, &obuf);
if (api_result == awk_false) {
make_number(-1.0, result);
} else {
//GET OFFSET OF CURRENT FILE ACCORDING TO OS
off_t position = lseek(ibuf->fd, 0, SEEK_CUR);
make_number(position, result);
}
return result;
}
/* init_lseek */
static awk_bool_t
init_lseek(void)
{
int errors = 0;
return errors == 0;
}
static awk_ext_func_t func_table[] = {
{"lseek", do_lseek, 0, 0, awk_false, NULL},
};
/* define the dl_load function using the boilerplate macro */
dl_load_func(func_table, lseek, "")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.