백엔드 개발 PHP 튜토리얼 Lua와 C 언어가 서로 호출합니다.

Lua와 C 언어가 서로 호출합니다.

Aug 08, 2016 am 09:23 AM
include lua printf quot

lua-nginx-module에는 lua와 c 언어 간의 상호 변조가 많이 나타납니다. 다음은 "Lua 프로그래밍"의 24-27장에 나오는 테스트 코드입니다.

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
#include <stdarg.h>
#include <stdlib.h>

#define MAX_COLOR 255

static void stackDump(lua_State *L);

static int l_split(lua_State *L)
{
	const char *s = luaL_checkstring(L, 1);
	const char *sep = luaL_checkstring(L, 2);
	const char *e;
	int i = 1;
	
	lua_newtable(L);
	
	while ((e = strchr(s, *sep)) != NULL)
	{
		lua_pushlstring(L, s, e-s);
		lua_rawseti(L, -2, i ++);
		s = e + 1;
	}
	
	lua_pushstring(L, s);
	lua_rawseti(L, -2, i);
	
	return 1;
}

int l_map(lua_State *L)
{
	int i, n;
	luaL_checktype(L, 1, LUA_TTABLE);
	luaL_checktype(L, 2, LUA_TFUNCTION);
	
	n = lua_objlen(L, 1);
	for (i = 1; i <= n; i ++)
	{
		//stackDump(L);
		//printf("=====1=====\n");
		lua_pushvalue(L, 2);
		//stackDump(L);
		//printf("=====2=====\n");
		lua_rawgeti(L, 1, i);
		//stackDump(L);
		//printf("=====3=====\n");
		lua_call(L, 1, 1);
		//stackDump(L);
		//printf("=====4=====\n");
		lua_rawseti(L, 1, i);
		//stackDump(L);
		//printf("=====5=====\n");
	}
	
	return 0;
}

// 通过Lua调用的c函数,通过打印栈说明每个函数有独立的栈
// 将c函数注册到lua中,从而被lua调用。
static int l_sin(lua_State *L)
{
	double d = lua_tonumber(L, 1);
	lua_pushnumber(L, sin(d));
	
	// stackDump(L);
	// printf("====l_sin===\n");
	
	return 1;
}

// c 调用lua 函数
// 从Lua中得到函数,在c语言中传入参数。
double f(lua_State *L,double x, double y)
{
	double z;
	lua_getglobal(L, "f");
	lua_pushnumber(L, x);
	lua_pushnumber(L, y);
	// table function 1.1 2.2 说明c语言调用Lua会共享相同的栈.
	// stackDump(L);
	// printf("=====f=====\n");
	
	if (lua_pcall(L, 2, 1, 0) != 0)
		printf("call f error\n");
	
	if (!lua_isnumber(L, -1))
		printf("function f must return a number\n");
	
	z = lua_tonumber(L, -1);
	lua_pop(L, 1);
	return z;
}

int getfield(lua_State *L, const char *key)
{
	int result;
	// stackDump(L);
	// printf("==1==\n");
	lua_getfield(L, -1, key);
	// stackDump(L);
	// printf("==2==\n");
	if (!lua_isnumber(L, -1))
		printf("invalid component\n");
	result = lua_tonumber(L, -1);
	lua_pop(L, 1);
	// stackDump(L);
	// printf("==4==\n");
	return result;
}

static void stackDump(lua_State *L)
{
	int i;
	int top = lua_gettop(L);
	for (i = 1; i <= top; ++ i)
	{
		int t = lua_type(L, i);
		switch(t) {
		case LUA_TSTRING:
			printf("'%s'", lua_tostring(L, i));
			break;
		case LUA_TBOOLEAN:
			printf(lua_toboolean(L, i) ? "true" : "false");
			break;
		case LUA_TNUMBER:
			printf("%g", lua_tonumber(L, i));
			break;
		default:
			printf("%s", lua_typename(L, t));
			break;
		}
		printf(" ");
	}
	printf("\n");
}

void load(lua_State *L, const char *fname, int *w, int *h) {
	if (luaL_loadfile(L, fname) || lua_pcall(L, 0, 0, 0))
			printf("cannot run config.file\n");
	
	/*lua_getglobal(L, "height");
	lua_getglobal(L, "width");
	
	if (!lua_isnumber(L, -2))
		printf("width should be a number\n");
	
	if (!lua_isnumber(L, -1))
		printf("height should be a number\n");
	
	*w = lua_tointeger(L, -2);
	*h = lua_tointeger(L, -1);*/
	
	lua_getglobal(L, "table");
	
	if (!lua_istable(L, -1))
		printf("background should be table\n");
	
	printf("%f\n", f(L, 1.1, 2.2));
	
	float red = getfield(L, "r");
	float green = getfield(L, "g");
	float blue = getfield(L, "b");
	
	printf("%f, %f, %f\n", red, green, blue);
}

// lua 调用c代码可以模仿这里的格式
const char* testfunc = "t = mysplit(\"hi, hello\", \",\"); print(t[1], t[2])";

int main(void)
{
	char buff[256];
	int error;
	lua_State *L = luaL_newstate();
	luaL_openlibs(L);
	int w, h;
	// load(L, "test.lua", &w, &h);
	
	lua_pushcfunction(L, l_sin);
	lua_setglobal(L, "mysin");
	
	lua_pushcfunction(L, l_map);
	lua_setglobal(L, "mymap");
	
	lua_pushcfunction(L, l_split);
	lua_setglobal(L, "mysplit");
	
	if (luaL_dostring(L, testfunc))
		fprintf(stderr, "%s", lua_tostring(L, -1));
	
	/*
	while (fgets(buff, sizeof(buff), stdin) != NULL)
	{
		error = luaL_loadbuffer(L, buff, strlen(buff), "line");
		stackDump(L);
		error = error || lua_pcall(L, 0, 0, 0);
		stackDump(L);
	}
	
	if (error) {
		fprintf(stderr, "%s", lua_tostring(L, -1));
		lua_pop(L, 1);
	}*/
	
	lua_close(L);
	return 0;
}
로그인 후 복사

test.lua

BULE = {r = 0, g = 0, b = 1}
table = {["r"] = 10, ["g"] = 23, ["b"] = 33}

function f(x, y)
	return x + y
end
로그인 후 복사

컴파일: gcc test.c -I/usr/local/include/luajit- 2.0 -llua-5.1 -lm

위에는 관련 내용을 포함하여 Lua와 C 언어 간의 상호 호출을 소개하고 있으며, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Nginx에 대한 Lua 지원을 설치하고 구성하는 방법 Nginx에 대한 Lua 지원을 설치하고 구성하는 방법 Jun 02, 2023 pm 10:01 PM

Nginx 설치 및 구성 Lua 지원 기본적으로 Nginx는 Lua 모듈을 지원하지 않습니다. LuaJIT 인터프리터를 설치하고 Nginx를 다시 컴파일해야 하거나 중국인이 개발한 openrestry에 필요한 모듈인 LuaJIT, Ngx_devel 및 lua-nginx-module1을 사용할 수 있습니다. . 환경 준비 [root @nginx_lua~]#yuminstall-ygccgcc-c++makepcre-develzlib-developenssl-devel2. 최신 luajit 및 ngx_devel_kit 및 lua-nginx-module 압축 해제 [r

mysql을 운영하기 위해 nginx와 lua를 통합하는 방법 mysql을 운영하기 위해 nginx와 lua를 통합하는 방법 May 16, 2023 pm 10:43 PM

구현 아이디어는 nginx에서 직접 블랙리스트를 구성하고 논리 블록을 작성하여 구현하는 것입니다. 서버(Java)에 필터를 작성하고 서버(Java)에 인터셉터를 통합합니다. 차단; 여기에 3가지 구현 아이디어가 있습니다. 구현 솔루션에 관해서는 더 있을 수 있지만 생각해 보면 nginx에서 논리 블록을 작성하는 것은 많은 사람들이 잘하는 것 같지 않습니다. 코드 수준이지만 이것은 첫째, 높은 동시성이 관련된 피크 비즈니스 기간 동안 필연적으로 백엔드 서비스에 더 큰 압력을 가할 것입니다. 그렇다면 이를 처리할 수 있는 다른 더 좋은 방법이 있습니까? 이것이 제가 lua에 대해 말하고 싶은 것입니다. 즉, nginx는 lua를 통합할 수 있기 때문에 nginx는 게이트웨이 역할을 하고 여전히 프록시 서버 역할을 합니다.

Vue.js와 Lua 언어를 통합하여 경량 임베디드 애플리케이션 작성 Vue.js와 Lua 언어를 통합하여 경량 임베디드 애플리케이션 작성 Jul 31, 2023 pm 02:23 PM

경량 임베디드 애플리케이션을 작성하기 위한 Vue.js와 Lua 언어의 통합 현대 개발에서는 프런트 엔드 프레임워크 Vue.js와 스크립팅 언어 Lua가 각각 광범위한 애플리케이션을 가지고 있습니다. Vue.js는 사용자 인터페이스 구축을 위한 진보적인 프레임워크인 반면, Lua는 임베디드 애플리케이션 및 게임 개발에 자주 사용되는 경량 스크립팅 언어입니다. 이 기사에서는 Vue.js를 Lua 언어와 통합하여 경량 임베디드 애플리케이션을 작성하는 방법을 소개하고 코드 예제를 제공합니다. 먼저 Vue.j를 설치해야 합니다.

PHP include와 include_once의 차이점은 무엇입니까 PHP include와 include_once의 차이점은 무엇입니까 Mar 22, 2023 am 10:38 AM

PHP를 사용하여 웹 페이지를 작성할 때 때로는 현재 PHP 파일에 다른 PHP 파일의 코드를 포함해야 할 때가 있습니다. 이때, include 또는 include_once 함수를 사용하여 파일 포함을 구현할 수 있습니다. 그렇다면 include와 include_once의 차이점은 무엇입니까?

Vue.js 및 Lua 언어 통합, 게임 개발을 위한 프런트엔드 엔진 구축 시 모범 사례 및 경험 공유 Vue.js 및 Lua 언어 통합, 게임 개발을 위한 프런트엔드 엔진 구축 시 모범 사례 및 경험 공유 Aug 01, 2023 pm 08:14 PM

Vue.js와 Lua 언어의 통합, 게임 개발을 위한 프런트엔드 엔진 구축을 위한 모범 사례 및 경험 공유 소개: 게임 개발이 지속적으로 발전함에 따라 게임 프런트엔드 엔진의 선택이 중요한 결정이 되었습니다. 이러한 선택 중에서 Vue.js 프레임워크와 Lua 언어는 많은 개발자의 초점이 되었습니다. 널리 사용되는 프런트엔드 프레임워크인 Vue.js는 풍부한 생태계와 편리한 개발 방법을 갖추고 있으며, Lua 언어는 가볍고 효율적인 성능으로 인해 게임 개발에 널리 사용됩니다. 이 기사에서는 다음 방법을 살펴보겠습니다.

Redis+Lua 스크립트를 사용하여 카운터 인터페이스의 스와이프 방지 기능을 구현하는 방법 Redis+Lua 스크립트를 사용하여 카운터 인터페이스의 스와이프 방지 기능을 구현하는 방법 May 28, 2023 pm 11:32 PM

[구현 과정] 1. 문제 분석 set 명령을 설정했지만 만료 시간 설정 시 네트워크 지터 등의 이유로 설정에 실패하면 데드 카운터(교착 상태와 유사)가 나타납니다. 2. 해결 방법 Redis; +Lua Redis가 방해받지 않고 실행되도록 set 명령과 만료 명령을 함께 작동시키는 좋은 솔루션입니다. 이는 원자적 작업을 대규모로 보장한다고 말하는 이유입니다. 완전히 보장하기보다는 어느 정도? Redis가 내부에서 실행될 때 문제가 발생할 수 있기 때문에

Java 생태계/Redis에서 Lua 스크립트를 사용하는 방법 Java 생태계/Redis에서 Lua 스크립트를 사용하는 방법 Jun 02, 2023 pm 10:41 PM

1. LUA 설치 Mac에 LUA를 설치하는 것은 매우 간단합니다. Brew 관련 명령을 직접 사용하면 됩니다. Brewinstalllua는 lua-v 명령을 사용하여 lua가 설치되었는지 확인합니다. 1) test.lua 파일을 생성하는 간단한 방법, 내용은 다음과 같습니다. 실행 명령: luatest.lua 출력은 다음과 같습니다. 2. Lua 구문 소개 Lua는 대화형 프로그래밍 및 스크립트 프로그래밍을 제공합니다. 대화형 프로그래밍: 명령줄에 구문을 직접 입력합니다. , 즉시 실행하여 실행 효과를 확인할 수 있습니다. 스크립팅은 프로그래밍입니다. 스크립트 파일을 작성한 다음 실행합니다. 1. 주석 Lua는 한 줄 주석과 여러 줄 주석이라는 두 가지 주석 방법을 제공합니다. 1) 한 줄 주석에는 두 개의 빼기 기호를 사용합니다.--2) 여러 줄 주석--[[여러 줄 주석 여러 줄

idaPro가 앱 복호화 Lua 스크립트를 분석하는 방법 idaPro가 앱 복호화 Lua 스크립트를 분석하는 방법 May 18, 2023 am 08:34 AM

이전 idaPro 디버깅 또는 후킹을 통해 xxtea 암호 해독 키를 얻을 수 있습니다. 서명을 위해 원본 파일을 직접 열 수 있습니다. 서명 값 byds를 볼 수 있습니다. 따라서 우리는 xxtea 복호화 도구(GitHub의 소스 코드에서 컴파일 가능)를 사용하여 복호화를 시도할 수 있습니다. index.luac를 예로 들어 index.luac 복호화 전후의 변경 사항을 살펴보겠습니다. xxtea에 의한 암호 해독 후의 lua 스크립트는 여전히 일반 텍스트가 아닙니다! 이전에 cocos2d 프레임워크 소스 코드와 마스터 apk 디코딩 결과를 바탕으로 xxtea 암호화가 사용된 것으로 판단했으며, 앱의 Lua 스크립트에도 xxtea 암호화 방법임을 확인하는 서명 값이 있습니다.

See all articles