C,linux - 挂起一个线程,直到某些数据到达

时间:2013-10-19 22:36:45

标签: c linux multithreading file-descriptor

我想创建将等待来自文件描述符(串行端口)的数据的线程。在那段时间里,我必须能够通过这个端口发送数据。

我试图使用 pthread poll ,但程序从一开始就挂起(睡觉),甚至不在main函数中执行第一个命令。

问题肯定是民意调查功能 - 当我限制一段时间后,所有指令都在这段时间后执行。

这是我的代码:

#define SERIAL_DEVICE "/dev/ttyUSB0"
#define SERIAL_BAUD 2400

#include <wiringSerial.h>
#include <stdio.h>
#include <pthread.h>
#include <poll.h>


//deklaracje
void *receiving( void *ptr )
{
    printf("New thread started");
    int fd= (int)ptr;
    struct pollfd fds[1];
    fds[0].fd = fd;
    fds[0].events = POLLIN ;
    int pollrc=-1;

    while(1)
    {
        pollrc = poll( fds, 1, -1);
        if (pollrc < 0)
        {
            perror("poll");
        }
        else if( pollrc > 0)
        {
            if( fds[0].revents & POLLIN )
            {
                unsigned char buff[1024];
                ssize_t rc = read(fd, buff, sizeof(buff) );
                if (rc > 0)
                {
                    printf("RX: %s",buff);
                }

            }
        }
    }
}


int main(int argc, char *argv[])
{
    int fd = serialOpen(SERIAL_DEVICE, SERIAL_BAUD);

    if (fd<0)
    {
        printf("Serial opening error");
        return 1;
    }

    pthread_t serialReceiver;
    printf("-----");
    int thr=pthread_create(&serialReceiver,NULL,receiving,fd);
    printf("%i",thr);
    if(thr!=0)
    {
        printf("Error during creating serialReceiver thread.");
        return 1;
    }

    int status;
    pthread_join(serialReceiver,(void **)&status);

    printf("%i",status);

    return 0;
}

2 个答案:

答案 0 :(得分:0)

您可以使用select()等待文件描述符,直到有一些数据要读取。

您可以阅读有关使用情况的here

答案 1 :(得分:0)

抱歉,我迟到了。你遇到的问题不是你的民意调查,而是你的printf。当您使用read时,它不会在字符串的末尾放置一个null终止符。它改为返回字符串的长度。当printf与read一起使用时,您希望通过使用printf("RX: %*.s", rc, buff)告诉printf在读取的字符数量之后停止写入。现在,它将写入rc个字符而不是写入,直到找到空终止符。