繁体   English   中英

如何查看打开文件描述符的当前搜索 position?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM