Valgrind不使用select

Valgrind不使用select,c,linux,multithreading,select,valgrind,C,Linux,Multithreading,Select,Valgrind,我对valgrind和select有问题。当我在终端中运行我的应用程序或使用gdb运行我的应用程序时,我没有收到任何错误。一切正常,如预期 使用valgrind运行应用程序时,出现以下错误: valgrind --tool=memcheck --leak-check=full ./myservice ==3403== Thread 12: ==3403== Syscall param select(readfds) points to uninitialised byte(s) ==3403==

我对valgrind和select有问题。当我在终端中运行我的应用程序或使用gdb运行我的应用程序时,我没有收到任何错误。一切正常,如预期

使用valgrind运行应用程序时,出现以下错误:

valgrind --tool=memcheck --leak-check=full ./myservice
==3403== Thread 12:
==3403== Syscall param select(readfds) points to uninitialised byte(s)
==3403==    at 0x41C3E31: ??? (syscall-template.S:81)
==3403==    by 0x805531B: myThread (myservice.c:2062)
==3403==    by 0x40CAF6F: start_thread (pthread_create.c:312)
==3403==    by 0x41CBBED: clone (clone.S:129)
==3403==  Address 0xf5c9f38 is on thread 12's stack
==3403==
Sep 15, 2015 | 10:30:32 | select: Bad file descriptor
我的应用程序本身将打印出以下错误:

valgrind --tool=memcheck --leak-check=full ./myservice
==3403== Thread 12:
==3403== Syscall param select(readfds) points to uninitialised byte(s)
==3403==    at 0x41C3E31: ??? (syscall-template.S:81)
==3403==    by 0x805531B: myThread (myservice.c:2062)
==3403==    by 0x40CAF6F: start_thread (pthread_create.c:312)
==3403==    by 0x41CBBED: clone (clone.S:129)
==3403==  Address 0xf5c9f38 is on thread 12's stack
==3403==
Sep 15, 2015 | 10:30:32 | select: Bad file descriptor
我对valgrind很陌生,所以我不了解valgrind是如何打破选择的。相关代码粘贴在下面

全球管道

int pipefd[2];
中断处理器

void intHandler(int sig) {
    keepRunning = false;
    write(pipefd[1], "terminate", sizeof("terminate"));
}
主要

我的线

void *myThread(void *ptr) {
    struct timeval tv;
    tv.tv_sec = 5;
    tv.tv_usec = 0;
    ...
    int socketfd = 555; //edit: forgot to include socketfd code, this is the error
    ...
    fd_set readfs;
    FD_ZERO(&readfs);
    FD_SET(pipefd[0], &readfs);
    if(select(socketfd+1, &readfs, NULL, NULL, &tv) < 0){ //ln 2062
        snprintf(logMessage, sizeof(logMessage),"select: %s", strerror(errno));
        writeLog(logMessage);
    }
    ...
}
基本上,我想优雅地终止我的应用程序。我在main中初始化管道,并使用该管道监视select语句。如果不向管道写入数据,选择器将一直处于空闲状态,直到超时。我使用信号处理程序写入管道,这样我的select语句就可以知道管道已经被写入并停止等待

我如何将一个管道用于多个线程的问题是什么?据我所知,select实际上并没有接触数据,只是看到数据在那里。因此,每个线程都应该看到管道上的数据,修改自己的fd_集,并在超时之前退出select,这与我在gdb中看到的一致

修复编辑-对select使用了错误的nfds值,通过使用readfs中的pipefd进行了更正

    if(select(pipefd[0]+1, &readfs, NULL, NULL, &tv) < 0){ //ln 2062

我认为如果没有更多的代码,这是很棘手的。只向集合中添加一个FD,但将socketfd+1作为FD数传递。socketfd的值是多少?我无法重现这个问题;相反,我看到了一个完全不同的问题:无法成功编译。也许你是想问这个问题?正如前面所说的,更多的代码会很有用。然而,Valgrind可以极大地改变线程之间的计时,我相信这是用于测试目的的plus,它可能会导致迄今为止隐藏的一些问题。socketfd可能未初始化还是非常大?valgrind将在处理select系统调用时检查arg1/8字节的arg2。@slugonamission似乎我只能通知一个用户-谢谢大家的评论。你很好。我的袜子是非常不正确的。将该值更改为“pipefd[0]+1”将使valgrind功能正确。我很惊讶这在终端和gdb中起作用。我很抱歉没有包括这一点,我将编辑文章,以包括socketfd代码,这样问题的形式更好,以便其他人可以看到错误。我还将把答案添加到底部,如果有人回答,我会标记一个答案,因为我不能将评论标记为答案。再次感谢你!