lua使用ffi调用c程序的函数

参考: https://blog.csdn.net/weiwangchao_/article/details/16880401

    http://luajit.org/ext_c_api.html

          https://www.cnblogs.com/darkknightzh/p/5812763.html

lua 调用 C,需要用到 lua 的 ffi 库,它允许从纯Lua代码调用外部C函数,使用C数据结构,但是C的数据类型并不一定都能转化成lua的数据类型。

#include <unistd.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <stdio.h>
#include <dirent.h>

struct rlimit rlmt;

char* get_size()
{
  if (getrlimit(RLIMIT_CORE, &rlmt) == -1) {
  return -1;
  }
  return (char*)rlmt.rlim_cur;

};

char* set_size(double CORE_SIZE)
{
  rlmt.rlim_cur = (rlim_t)CORE_SIZE;
  rlmt.rlim_max = (rlim_t)CORE_SIZE;

  if (setrlimit(RLIMIT_CORE, &rlmt) == -1) {
  return -1;
  }

  return (char*)rlmt.rlim_cur;

};


int cd_chdir(const char *dirname)
{
  int a=chdir(dirname);
  return a;

};

【g++ 编译一下,变成 *.so 文件 】

下面为 Makefile  文件, 在目录下 make  能直接生成 *.so  文件 ,修改里面的  *.so   *.o  文件

## Linux/BSD

LDFLAGS += -shared

CFLAGS ?= -g -O -Wall
override CFLAGS += -fpic

#CC = gcc
RM = rm -f

COPY = cp

all: my_corefile.so

my_corefile.o: my_corefile.c

my_corefile.so: my_corefile.o
$(CC) $(LDFLAGS) $^ -o $@

clean:
$(RM) *.so *.o

 

lua  文件

local ffi = require 'ffi'
--local ffi_string = ffi.string
--local ffi_new = ffi.new
--local C = ffi.C


ffi.cdef[[
  int get_size();
  int set_size(long CORE_SIZE);
  int cd_chdir(const char *dirname);
]]

set_get_core = ffi.load('/home/chentao/c_test/c_lua/qq/mycorefile/my_corefile.so')--直接导入绝对路径

local a = set_get_core.get_size()
print(a)


local b = set_get_core.set_size(524280)
print(b)

print("hass set")
local a = set_get_core.get_size()
print(a)

print(os.getenv("PWD"))

print(" cd ",set_get_core.cd_chdir("/home"))

导入路径为 绝对路径

posted @ 2019-06-17 20:31  马克图  阅读(2281)  评论(0编辑  收藏  举报