小编Ste*_*ark的帖子

如何确保GCC中的结构(按名称)完全初始化?

当使用指定的初始化器时,如何确保我的结构的每个字段都在GCC中初始化?(我对函数指针特别感兴趣.)(我使用的是C而不是C++.)

这是一个例子:

typedef struct {
    int a;
    int b;
} foo_t;

typedef struct {
    void (*Start)(void);
    void (*Stop)(void);
} bar_t;

foo_t fooo = { 
        5 
    };

foo_t food = { 
        .b=4 
    };

bar_t baro = {
        NULL
    };

bar_t bard = { 
        .Start = NULL
    };
Run Code Online (Sandbox Code Playgroud)

-Wmissing-field-initializers根本没用.它仅适用于GCC(mingw 4.7.3,4.8.1)中的fooo ,并且clang仅略微更好(没有食物和吟游诗人的警告).

我确定没有为指定的初始化程序生成警告的原因(即使我明确要求它们)但我想要/需要它们.我不想基于订单/位置初始化结构,因为这更容易出错(例如交换Start和Stop甚至不会发出任何警告).并且gcc和clang都不会发出任何警告我没有明确初始化字段(按名称初始化时).我也不想因为多种原因而使用if(xy == NULL)行丢弃我的代码,其中一个是我想要编译时警告而不是运行时错误.

至少夹板会给我所有4个案例的警告,但不幸的是我不能一直使用splint(它在一些代码上窒息(无法解析一些C99,GCC扩展)).

注意:如果我使用的是真实函数而不是NULL,GCC也会显示baro警告(但不是bard).

我搜索谷歌和堆栈溢出但只找到相关的问题,并没有找到这个具体问题的答案.我发现的最佳匹配是"确保结构中的所有元素都已初始化" 确保结构中的 所有元素都已初始化 哪个问题几乎相同,但没有令人满意的答案.

有没有更好的处理方法,我没有提到过?(也许是其他代码分析工具?最好可以集成到Eclipse或Visual Studio中的东西(免费)...)

c gcc

12
推荐指数
2
解决办法
1167
查看次数

命名管道上的Poll()会不断地立即返回POLLHUP

打开一个带有非阻塞标志的命名管道(由mkfifo创建的fifo)(打开(... O_NONBLOCK))然后开始轮询(poll(...)).到现在为止还挺好.然后从命令行我做了几个

echo 123 > /tmp/fifo
Run Code Online (Sandbox Code Playgroud)

它们都按预期读出管道(至少我希望它们应该如何正常工作).

我的问题是,在第一次回显之后,POLLHUP被设置并且它被卡住,轮询立即从该点返回.

如何清除 /摆脱POLLHUP

它开始让我发疯:(

是的,管道的另一端被关闭(之前打开),所以它变成了一半关闭,但我的结束仍然是开放和活着的,我喜欢这样.它还没死,我仍然可以通过管道收到新的回声,它只是民意调查POLLHUP的河流(我在事件中首先没有要求,但民意调查只能标记它们[人民调查:" revents可以包括在事件中指定的任何一个,或者值POLLERR,POLLHUP "] 之一,并且因此而无用.

显然我无法将fd从集合中删除,因为我仍然希望收到关于它的新数据的通知.

我不想关闭它,因为它不是一次性使用管道,我喜欢重复使用同样的东西而不是把它们扔掉......除此之外我还没有管道名称,我只有文件描述符(从fd获取文件名看起来像个婊子......我也用Google搜索...)

我仍然相信Linux的强大功能,并且必须有更好的(更高性能/竞争条件安全)方式来实现这一点.

这是我读过的,但没有帮助解决问题.

在我的绝望中,我尝试做这样的事情(这没有帮助):

    int newfd = dup(fds[i].fd);
    close(fds[i].fd);
    dup2(newfd, fds[i].fd);
    close(newfd);
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?我做错了什么吗?

(我总是可以回到试图定期读取所有管道(实际上是有效的),现在这不是延迟关键,但我不知道如果它是......我会怎么做?)

下面是一些代码重现我的问题(这不是我想要建立的生产代码,有明显超过1管,我想轮询...)

#include <stdio.h>

#include <sys/types.h>  // mkfifo
#include <sys/stat.h>   // mkfifo

#include <unistd.h>
#include <fcntl.h>

#include <errno.h>
#include <string.h>

#include <poll.h>


int …
Run Code Online (Sandbox Code Playgroud)

c linux named-pipes

6
推荐指数
1
解决办法
2846
查看次数

标签 统计

c ×2

gcc ×1

linux ×1

named-pipes ×1