我有一段代码来创建从输入参数打印消息的函数。
我一直在使用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","");
}
答案 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
。