Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C event_new()函数在hpux安腾上失败_C_Hp Ux_Libevent - Fatal编程技术网

C event_new()函数在hpux安腾上失败

C event_new()函数在hpux安腾上失败,c,hp-ux,libevent,C,Hp Ux,Libevent,我正在尝试调试使用libevent库的代码。在该库中,有一个函数event_new,假设它创建一个event_cb。在我分派事件库之后,无法调用或访问事件。此问题仅在hpux安腾上发生。此代码适用于hpux pa risc、Redhat、AIX和Solaris。有什么特定的东西需要设置吗 这是代码的一部分 int ttypread (int fd, Header *h, char **buf) { int c,k; struct user_data user_data;

我正在尝试调试使用libevent库的代码。在该库中,有一个函数event_new,假设它创建一个event_cb。在我分派事件库之后,无法调用或访问事件。此问题仅在hpux安腾上发生。此代码适用于hpux pa risc、Redhat、AIX和Solaris。有什么特定的东西需要设置吗

这是代码的一部分

int ttypread (int fd, Header *h, char **buf)
{

    int c,k;
    struct user_data user_data;
    struct bufferevent *in_buffer;
    struct event_config *evconfig;

    log_debug("inside ttypread");

    in_buffer = NULL;
    user_data.fd = fd;
    user_data.h = h;
    user_data.buf = buf;

    log_debug("from user_data, fd = %d",user_data.fd);  //the log_debug is a debugging function for me to check the value sent by the system. I use it to compare between each platform
    log_debug("from user_data, buf = %s",user_data.buf);
    log_debug("from user_data, h.len = %d",user_data.h->len);
    log_debug("from user_data, h.type = %d",user_data.h->type);

    evconfig = event_config_new();
    if (evconfig == NULL) {
            log_error("event_config_new failed");
            return -1;
    }

    if (event_config_require_features(evconfig, EV_FEATURE_FDS)!=0) {
            log_error("event_config_require_features failed");
            return -1;
    }

    base = event_base_new_with_config(evconfig);
    if (!base) {
            log_error("ttypread:event_base_new failed");
            return -1;
    }

    const char* method;              //these 3 lines are the new line edited
    method = event_base_get_method(base);
    log_debug("ttyread is using method = %s",method);

    ev = event_new(base, fd, EV_READ|EV_PERSIST, ttypread_event_cb, &user_data);
    c = event_add(ev, NULL);
    log_debug("ttypread passed event_add with c value is %d",c);

    in_buffer = bufferevent_socket_new(base, STDIN_FILENO, BEV_OPT_CLOSE_ON_FREE);
    log_debug("ttypread passed bufferevent_socket_new");
    if(in_buffer == NULL){
            log_debug("problem with bufferevent_socket_new");
    }
    bufferevent_setcb(in_buffer, in_read_cb, NULL, in_event_cb, NULL);
    bufferevent_disable(in_buffer, EV_WRITE);
    bufferevent_enable(in_buffer, EV_READ);

    k =event_base_dispatch(base);
    log_debug("event_base have been dispatched"); //when looking at the debugging file, the other plaform will go to ttypread_event_cb function. But for hpux itanium, it stays here.

    if (k == 0){
            log_debug("event_base_dispatch returned 0");
    } else if (k == -1){
            log_debug("event_base_dispatch returned -1");
    } else  {
            log_debug("event_base_dispatch returned 1");
    }
    event_base_free(base);
    event_free(ev);

    log_debug("finish ttypread");
    log_debug("ttypread_ret will return [%d]",ttypread_ret);
    return ttypread_ret;
}

void ttypread_event_cb(evutil_socket_t fd, short events, void *arg)
{
    int nread;
    struct timeval  t;
    struct user_data *user_data;

    user_data = (struct user_data*)arg;
    nread = 0;

    log_debug("inside ttypread_event_cb");
    if (events & EV_READ) {
            log_debug("got events & EV_READ");
            nread = ttyread(fd, user_data->h, user_data->buf);
            if (nread == -1) {
                    ttypread_ret = -1;
                    event_del(ev);
                    event_base_loopexit(base, NULL);
            } else if (nread == 0) {
                    if (access(input_filename, F_OK)!=0) {
                            log_debug("cannot access [%s]",input_filename);
                            tcsetattr(0, TCSANOW, &old);  /* Return terminal state */
                            exit(EXIT_SUCCESS);
                    }
                    t.tv_sec = 0;
                    t.tv_usec = 250000;
                    select(0, 0, 0, 0, &t);
            } else {
                    ttypread_ret = 1;
                    event_del(ev);
                    event_base_loopexit(base, NULL);
            }
    }
    else if (events & EV_WRITE) {
    log_debug("got events & EV_WRITE");
    }
}
不确定这是否有帮助。但只是一些关于hpux安腾的信息

uname-a=HP-UX hpux ita B.11.23 U ia64

如果您需要关于函数的任何附加信息或其他声明,请留下评论,我将编辑问题


编辑:我在ttypread中添加了一个函数。不知何故,对于hpux安腾来说,它正在返回devpoll,而其他平台正在返回poll。我不确定这是否是问题所在。但是如果是这样的话,我有什么办法来改变它吗?

在检查了event\u base\u get\u方法的结果后,我发现只有在我的hpux安腾上才使用了devpoll方法。我就是这样解决的

    char string[8] = "devpoll";
    struct user_data user_data;
    struct bufferevent *in_buffer;
    struct event_config *evconfig;
    const char *method;
    const char *devpoll;

    devpoll = string;
    in_buffer = NULL;
    user_data.fd = fd;
    user_data.h = h;
    user_data.buf = buf;

    evconfig = event_config_new();
    if (evconfig == NULL) {
            log_error("event_config_new failed");
            return -1;
    }

    if (event_config_require_features(evconfig, EV_FEATURE_FDS)!=0) {
            log_error("event_config_require_features failed");
            return -1;
    }

    if (event_config_avoid_method(evconfig,devpoll) != 0)
    {
            log_error("Failed to ignore devpoll method");
    }

使用devpoll强制libevent忽略,改为使用poll。

在我的调试文件中“无法调用或访问事件”的确切含义是什么。运行事件\u base\u分派后。我想看到日志调试(“在ttypread事件中”)。不知为什么,对于hpux安腾来说,它并没有显示出来。我向每一行添加了log_debug,它显示行在行事件\u base\u分派后停止。