免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3018 | 回复: 3
打印 上一主题 下一主题

请教: AIX下嵌入解析器出现SIGILL信号的问题(已解决) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-21 14:30 |只看该作者 |倒序浏览
已经解决

[ 本帖最后由 belial_g 于 2008-8-26 12:43 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-08-21 14:32 |只看该作者

回复 #1 belial_g 的帖子

在linux 下未出现问题.
/*-----------------------------------callf.c------------------------------------------*/
#define MAX_RESULT_NUM  100     /* 最大返回值个数 */
#define MAX_RESULT_LEN  1024    /* 返回值最大长度 */
#define OFFSET_ARGC 4
typedef struct _tagPRESULT
{
    int nums;    /* 返回值个数 */
    char *r_ary[MAX_RESULT_NUM];
}PRESULT;

#define CALL_SUCC(PR) ((PR) != NULL && (PR->nums >= 1))
                  
typedef PRESULT* (*FUNC)(const char *, int, char**);
typedef int (*INIT_FUNC)(const char*);
typedef void (*FINAL_FUNC)();
   
int main(int argc, char *argv[])
{
        int rc, i;
        int repeat, procs;
        int in_argc;
        char *in_argv[128] = { NULL };
        struct timeval now;
        pid_t pid;
        int istatus;

    PRESULT *result;
    INIT_FUNC init_func;
    FINAL_FUNC final_func;
       
        FUNC pFunc;
        void *FunctionLib;
        if (argc < 3)
        {
                printf("usage:\n\t%s file function\n", argv[0]);
                return 1;
        }
       
        FunctionLib = dlopen(argv[1], RTLD_LAZY /*RTLD_NOW*/);
        dlError = dlerror();
        if (dlError)
        {
                printf("dlopen return --%s--\n", dlError);
                return 1;
        }
       
        pFunc = (FUNC) dlsym(FunctionLib, argv[2]);
    dlError = dlerror();
        if (dlError)
        {
                printf("dlsym return --%s--\n", dlError);
                return 1;
        }
       
    init_func = (INIT_FUNC) dlsym(FunctionLib, "init_perl");
    dlError = dlerror();
        if (dlError)
        {
                printf("dlsym return --%s--\n", dlError);
                return 1;
        }
       
        final_func = (FINAL_FUNC) dlsym(FunctionLib, "final_perl");
    dlError = dlerror();
        if (dlError)
        {
                printf("dlsym return --%s--\n", dlError);
                return 1;
        }

        in_argc = argc - OFFSET_ARGC;

        for (i = 0; i < in_argc; i++)
        {
                in_argv = argv[i + OFFSET_ARGC];
        }

       
        printf("-->>>begin call sub <<<----\n");
       
        for (procs = 0; procs < 1; procs++)
        {
                if (fork() != 0) continue;

        if (init_func(NULL) != 0)
        {
                printf("init_func failed.\n");
                exit(2);
        }
        
                for (repeat = 0; repeat < 1; repeat++)
            {
            result = pFunc(argv[3], in_argc, in_argv);
            if (!CALL_SUCC(result))
            {
                    printf("procs[%d] repeat[%d] failed.\n", procs, repeat);
                    final_func();
                    exit(1);
            }
            printf("%s\n", result->r_ary[0]);
            }
            
        final_func();
            rc = dlclose(FunctionLib);
            dlError = dlerror();
        if (dlError)
        {
                printf("procs[%d] Close handle return-%s-\n", procs, dlError);
        }
            exit(0);
        }
       
        rc = dlclose(FunctionLib);
    dlError = dlerror();
    if (dlError)
    {
            printf("callf Close handle return-%s-\n", dlError);
    }
   
    while ((pid = waitpid(-1, &istatus, 0)) > 0)
    {
        /* 正常终止的子进程 */
        if (WIFEXITED(istatus) && !WEXITSTATUS(istatus))
            ;
        else if (WIFEXITED(istatus))
                printf("子进程%ld终止 返回码<%d>\n",
                         (long)pid, WEXITSTATUS(istatus));
        else if (WIFSIGNALED(istatus))
            printf("子进程%ld由于未捕获信号<%ld>终止\n",
                    (long)pid, WTERMSIG(istatus));
        else if (WIFSTOPPED(istatus))
            printf("子进程%ld由于信号<%d>终止\n",
                  (long)pid, WSTOPSIG(istatus));
    }
   
    if (rc) exit(1);
   
    return(0);
       
}

论坛徽章:
0
3 [报告]
发表于 2008-08-21 14:35 |只看该作者

回复 #1 belial_g 的帖子

/****************************embperl.c***********************************/
#include <stdlib.h>
#include "EXTERN.h"
#include "perl.h"
#include "embperl.h"
#ifdef _SCO_UNIX
#define SCO_BEGIN {
#define SCO_END }
#else
#define SCO_BEGIN
#define SCO_END
#endif

extern void xs_init (pTHX);

static void set_out_arg(SV* sv, char *out_arg);

static char g_result_area[MAX_RESULT_NUM][MAX_RESULT_LEN];

static PRESULT g_result;
static PerlInterpreter *my_perl;

int init_perl(const char *PLname)
{
    int i;
    int exitstatus;
    char *dummyargs[] = {"", "-e", "0" };
    char *PLargv[] = {"", NULL};

    PLargv[1] = (char *)PLname;
    my_perl = perl_alloc();
    perl_construct(my_perl);
    if (PLname == NULL || strlen(PLname) == 0)
        exitstatus = perl_parse(my_perl, xs_init, 3, dummyargs, NULL);
    else
        exitstatus = perl_parse(my_perl, xs_init, 2, PLargv, NULL);
#ifndef _SCO_UNIX
    PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
#else
    if (!exitstatus && PLname != NULL && strlen(PLname) > 0)
        exitstatus = perl_run(my_perl);
#endif
    for (i = 0; i < MAX_RESULT_NUM; i++)
        g_result.r_ary = g_result_area;
    g_result.nums = 0;
   
    if (exitstatus) final_perl();
    return exitstatus;
}

void final_perl()
{
    memset(&g_result, 0, sizeof(g_result));
    perl_destruct(my_perl);
    perl_free(my_perl);
}

/* perl 脚本解析器
   输入:
   script      脚本内容
   argc        输入参数个数
   argv        传送给脚本的参数
   返回:
     脚本的返回值
*/
PRESULT* ebperl_argv(const char *script, int argc, char* argv[])
{
    int n, i;
    SV* sv;
    SV *command;
    char *subroutine;
    STRLEN len;
    char errmsg[256];

    subroutine = calloc(1, strlen(script) + 32);
    sprintf(subroutine, "sub {%s}", script);
printf("begin perl_eval_pv\n");
    command = perl_eval_pv(subroutine, 1);
    if (SvTRUE(ERRSV))
    {
        strcpy(errmsg, SvPV(ERRSV, len));
        printf("perl_eval_pv err[%s]\n", errmsg);
        free(subroutine);
        return NULL;
    }
   
    free(subroutine);
    SCO_BEGIN
    dSP;
    ENTER;
    SAVETMPS;

    PUSHMARK(sp);


    for (i = 0; i < argc; i++)
    {
        XPUSHs(sv_2mortal(newSVpv(argv, 0)));
    }

    PUTBACK;
printf("begin perl_call_sv\n");
    n = perl_call_sv(command, G_ARRAY|G_EVAL);
printf("end call\n");
    if (SvTRUE(ERRSV))
    {
        strcpy(errmsg, SvPV(ERRSV, len));
        printf("n = %d perl_call_sv err--%s", n, errmsg);
        n = 0;
    }

    SPAGAIN;
    g_result.nums = n;
    while (n-- > 0)
    {
        sv = POPs;
        set_out_arg(sv, g_result.r_ary[n]);
    }

    PUTBACK;
    FREETMPS;
    LEAVE;   
    SCO_END
        
    return &g_result;
}



static void set_out_arg(SV* sv, char *out_arg)
{
    STRLEN len;

    switch (SvTYPE(sv))
    {
    case SVt_IV:         /* 1 */
    case SVt_PVIV:       /* 5 */
        sprintf(out_arg, "%d", SvIV(sv));
        break;
    case SVt_NV:         /* 2 */
    case SVt_PVNV:       /* 6 */
        sprintf(out_arg, "%lf", SvNV(sv));
        break;
    case SVt_RV:         /* 3 */
        if (SvROK(sv))
        {
            set_out_arg(SvRV(sv), out_arg);
        }
        else
            sv_dump(sv);
        break;
    case SVt_PV:         /* 4 */
    case SVt_PVMG:       /* 7 */
        snprintf(out_arg, MAX_RESULT_LEN, "%s", SvPV(sv, len));
        break;

    case SVt_PVBM:       /* 8 */
    case SVt_PVLV:       /* 9 */
    case SVt_PVAV:       /* 10 */
    case SVt_PVHV:       /* 11 */
    case SVt_PVCV:       /* 12 */
    case SVt_PVGV:       /* 13 */
    case SVt_PVFM:       /* 14 */
    case SVt_PVIO:       /* 15 */
        sv_dump(sv);
        break;
    default:
        sv_dump(sv);
        break;
    }
}

论坛徽章:
0
4 [报告]
发表于 2008-08-21 14:44 |只看该作者

回复 #3 belial_g 的帖子

make embperl.so
perl -MExtUtils::Embed -e xsinit -- -o xsinit.c
cc -c embperl.c `perl -MExtUtils::Embed -e ccopts`
cc -c xsinit.c `perl -MExtUtils::Embed -e ccopts`
cc -bnoentry -G -brtl -berok -bexpall -bM:SRE -o embperl.so embperl.o xsinit.o `perl -MExtutils::Embed -e ldopts`

make callso
cc -c callf.c
cc -o callso callf.o -ldl

[ 本帖最后由 belial_g 于 2008-8-21 14:46 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP