Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.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
select()返回当SIGALRM_C_Linux_Select - Fatal编程技术网

select()返回当SIGALRM

select()返回当SIGALRM,c,linux,select,C,Linux,Select,我很抱歉,如果这个问题已经响起-无法找到。。。所以 我有计时器: bzero(&rtc_act, sizeof(struct sigaction)); rtc_act.sa_handler = &rtc_handler; sigaction(SIGALRM, &rtc_act, NULL); rtc_timer.it_interval.tv_sec = SETTIMER_INTERVAL; rtc_timer.it_interval.tv_usec = 0; rtc_t

我很抱歉,如果这个问题已经响起-无法找到。。。所以 我有计时器:

bzero(&rtc_act, sizeof(struct sigaction));
rtc_act.sa_handler = &rtc_handler;
sigaction(SIGALRM, &rtc_act, NULL);

rtc_timer.it_interval.tv_sec = SETTIMER_INTERVAL;
rtc_timer.it_interval.tv_usec = 0;
rtc_timer.it_value.tv_sec = SETTIMER_VALUE;
rtc_timer.it_value.tv_usec = 0;

if (setitimer(ITIMER_REAL, &rtc_timer, NULL))
{
    printf(MSG_ERR_SETTIMER_FAIL);
    retval = RETURN_ERR_SETTIMER;
} /* if (setitimer(ITIMER_REAL, &rtc_timer, NULL)) */
我还阻止了套接字:

if ((modbus_socket = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
    retval = RETURN_ERR_SOCKET_OPEN;
    perror(MSG_ERR_OPEN_SOCKET);
    return retval;
} /* if (modbus_socket = socket(AF_INET, SOCK_STREAM, 0) < 0) */

setsockopt(modbus_socket, SOL_SOCKET, SO_REUSEADDR, (const void*)&optval , sizeof(unsigned int));

bzero((char*)&serv_addr, sizeof(serv_addr));

serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons((unsigned short)ZK91_TCP_PORT_NUMBER);

if (bind(modbus_socket, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0)
{
    perror(MSG_ERR_BIND_SOCKET);
    retval = RETURN_ERR_SOCKET_OPEN;
    return retval;
} /* if (bind(modbus_socket, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) */

if (listen(modbus_socket, TCP_CLIENTS_COUNT) < 0)
{
    perror(MSG_ERR_LISTEN_SOCKET);
    retval = RETURN_ERR_SOCKET_LISTEN;
    return retval;
} /* if (listen(parentfd, TCP_CLIENTS_COUNT) < 0) */
我在几秒钟内得到激活选择,尽管实际数据不可用

如果您尝试处理此连接:

新建\u套接字=接受modbus \u套接字、结构sockaddr*&客户端\u addr和客户端\u len

然后程序崩溃,从某个内存区域给屏幕10个字符:

我的消息传来了

������硨���L�

uclinux

如果我没有初始化计时器,那么一切都正常工作,但在计时器上我不能拒绝

原因是什么

谢谢。

选择返回后,您必须检查它返回的原因。你不能不检查就假设它说socketready for reading

使用宏完成检查,以查看套接字文件描述符是否仍在ready for reading集合中

如果select由于被中断而返回,它还将errno设置为EINTR,并返回-1。因为它通常返回三个输入集中的集合描述符的数量,所以您也应该检查返回值。除非select返回的值大于0,否则无需开始调用FD_ISSET。

如果select失败,则需要检查errno并忽略它以获得信号中断

比如:

for (;;) {
    int rv = select(...);
    if (rv < 0) {
        if (errno == EINTR)
            continue;    // Was a signal
        else
            // A real error occurred
    } else {
        // Handle event
    }
}

select(选择)是否真的表明任何套接字已准备好读取,或者只是表明它已使用errno=EINTR被中断?modbus_文件是否真的是列表中最高的fd?是否可以添加printf modbus_套接字%d Can_文件%d modbus_文件%d\n。。。;要查看哪个最高?errno==EINTR。这是我的错误。那代码不等于宏吗?我知道这是不可移植的,但这个问题被标记为linux,所以不一定需要一个可移植的解决方案。@simonc是的,在我看来是一样的;然而,我从未使用过那个宏,所以我对它一无所知。不管怎样,我宁愿手工编写这样复杂的代码,因为它让我更容易理解。谢谢。你选择返回的权利!不,此信号将被忽略。
for (;;) {
    int rv = select(...);
    if (rv < 0) {
        if (errno == EINTR)
            continue;    // Was a signal
        else
            // A real error occurred
    } else {
        // Handle event
    }
}