编译时写入()警告消息

时间:2013-12-15 23:24:59

标签: c warnings

我有一段代码来创建从输入参数打印消息的函数。

我一直在使用c9.io编译代码并且在没有警告的情况下运行良好,但是当我在本地执行它时会显示如下警告:

  

child2bok:c39:11:警告:忽略'write'的返回值,使用属性warn_unused_result声明[-Wunused -result]

这就是代码。这是一个write()定义的问题,但我是unix编程的新手,不知道解决它。它执行得很好,但在我交给老师之前我想删除警告。

您在这里是代码:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/time.h>
#include <unistd.h>

#include "rutines.h"

void children();
void show_help();

int main(int argc, char *argv[])
{
    int ord;

    if (argc > 1)
        ord = atoi(argv[1]);
    if (argc == 1)
    {
        show_help("Error"); 
        exit(1);
    }

    children(ord);
}

void children(int ord)
{
    char msg[10];

    srand(getpid());
    sleep(rand() % 5);
    sprintf(msg, " %d", ord);
    while (strlen(msg) > 0)
    {
    int written= write(1, msg, strlen(msg));
    if (written < 0)
    break;

    exit(0);
}

void show_help(char *err_message)
{
    write_string(err_message,"");
    write_string("Usage: child2aok \n","");
}

2 个答案:

答案 0 :(得分:1)

您应该检查并处理write()命令返回的值。来自write文档:

  即使在有效条件下,

写[...]也可能返回少于计数。

为什么不简单地使用printf(" %d", ord);代替sprintf(msg, " %d", ord); write(1, msg, strlen(msg))

答案 1 :(得分:0)

write不保证写入所有数据;它可以写入一个字节(或块,或返回错误,......)。所以你必须在循环中使用它

bool write_all(int fd, void * buf, size_t len)
{
    size_t remaining = len;

    for (size_t n; (n = write(fd, buf, remaining)) > 0; remaining -= n)
    { }

    return remaining == 0;
}

如果写入所有字节,则此函数返回true,错误时返回false