请教: AIX下嵌入解析器出现SIGILL信号的问题(已解决)

请教: AIX下嵌入解析器出现SIGILL信号的问题(已解决)

已经解决

在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);
       
}
/****************************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;
    }
}
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