Linux中write函数

功能:

     向文件中写入数据

头文件:

     #include  <unistd.h>

原型:

     ssize_t

write(int fd, const void *buf, size_t count);

参数:

     fd:         文件描述符

    buf:      存放要写入的数据的缓冲区首地址

     count:   想要写入的字节数

返回值:

     >=0:成功写入的字节数,0表示什么都没写入

     -1:   写入失败,并设置全局变量errno

例:

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <strings.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

int main(int argc, char *argv[])
{
if(argc < 2) {
fprintf(stderr,“Usage: %s \n”, argv[0]);
return -1;
}
int fd = 0;
if (0 > (fd = open(argv[1], O_WRONLY|O_CREAT|O_TRUNC, 0666)))
{
perror(“open”);
return -1;
}
char buf[100] = “hello world!”;
int ret;
if (strlen(buf) != write(fd, buf, strlen(buf)))
{
perror(“write”);
return-1;
}
printf(“Write file successfully!\n”);
close(fd);
return0;
}

注意:write第三个参数表示想要写入的字节数,返回值表示实际写入的字节数,-1表示出错。如果要查看真正写入的字节数需要看返回值。比如套接字文件或者管道文件,有时候不能一次性把整个buf全部写入文件,此时需要循环写入。

例:

ssize_t mywrite(int fd, const void *buf, size_t count)
{
ssize_t size = 0;
int ret = 0;
while (size < count)
{
ret = write(fd, buf+size, count-size);
size += ret;
}
return size;
}

上述函数mywrite的功能是保证能够成功写入count字节,mywrite的参数与write函数一样。size表示已经写入的字节数,当成功写入的字节数小于想要写入的字节数时,循环往文件中写,从buf偏移size处开始把剩下的内容写入文件,直到size等于count跳出循环。

当写入的文件时套接字或者管道文件时,有一个发送缓冲区,如果缓冲区已满,此时发送阻塞,这就是写阻塞。如果设置为非阻塞模式O_NONBLOCK,缓冲区写满后,返回-1,错误原因Resource temporarily unavailable。

当写入的文件时套接字或者管道文件时,
如果读端关闭,写端还在向对端写入数据时,此时会产生管道破裂信号SIGPIPE,导致程序终止。如果写进程没有报任何错误就结束,很有可能就是管道破裂造成,可以使用signal函数去捕捉该信号,判断错误原因

例: signal(SIGNAL, handler);

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: write函数Linux系统的一个系统调用函数,用于向文件描述符(文件、管道、套接字等)写入数据。 其函数原型为: ssize_t write(int fd, const void *buf, size_t count); 其,fd表示文件描述符,buf表示要写入的数据缓冲区,count表示要写入的数据长度。 函数返回值为成功写入的字节数,如果出现错误则返回-1,并设置errno变量来指示错误类型。 write函数的使用方法比较简单,只需要传入正确的参数即可。需要注意的是,写入的数据长度不能超过缓冲区的大小,否则可能会出现数据截断的情况。同时,需要根据实际情况判断是否需要进行错误处理。 ### 回答2: write()函数Linux系统上最常用的一个系统调用,用于向文件描述符所代表的文件写入指定的数据。它是标准I/O库的I/O函数之一,其原型如下: ssize_t write(int fd, const void *buf, size_t count); 其,fd指代要写入的文件描述符,buf是要写入的数据的起始地址,count是要写入的数据的大小。 使用write()函数时,需要先打开文件以获取文件描述符,然后通过write()函数向文件写入数据。如果写入成功,write()函数会返回写入的字节数;如果写入失败,write()函数会返回-1,并设置errno变量的值。 使用write()函数时,需要注意一些常见的问题。首先,写入时可能会出现部分写入的情况,也就是说,写入的字节数可能小于要求的字节数。其次,当要写入的数据量较大时,需要分批写入,以免一次写入的数据超出了操作系统设定的缓冲区大小,导致写入失败。 总之,write()函数Linux系统上非常重要的一个系统调用,它可以实现向文件写入数据的功能,是 Linux 上文件I/O编程的基础。在使用时要注重错误处理和缓冲区大小限制等问题。 ### 回答3: 在Linux系统write()函数用于将数据从用户空间写入到文件描述符指向的文件write()函数具有以下语法: ```c #include <unistd.h> ssize_t write(int fd, const void *buf, size_t count); ``` 其,fd表示文件描述符,buf表示写入的数据的缓存区指针,count表示需要写入的字节数。函数返回值为成功写入的字节数,如果出现错误则返回-1。 write()函数的使用步骤如下: 1. 打开文件,获取文件描述符。 ```c int fd = open("filename", O_WRONLY); if(fd == -1) { perror("open"); exit(EXIT_FAILURE); } ``` 其,O_WRONLY表示以只写方式打开文件,该函数返回值为-1表示打开失败。 2. 将数据写入文件。 ```c char buffer[1024] = "Hello World!"; ssize_t bytes_written = write(fd, buffer, strlen(buffer)); if(bytes_written == -1) { perror("write"); exit(EXIT_FAILURE); } ``` 其,strlen()函数用于获取缓存区的字节长度,bytes_written表示成功写入的字节数,如果返回-1表示写入失败。 3. 关闭文件。 ```c if(close(fd) == -1) { perror("close"); exit(EXIT_FAILURE); } ``` 如果返回-1表示关闭失败。 总结起来,write()函数主要用于将数据写入文件,使用时需要打开文件获取文件描述符,并将数据写入文件后关闭文件。需要注意的是,写的数据长度应该与缓冲区大小一致,否则可能会发生写入数据不完整的情况。此外,还需要根据返回值判断写入是否成功。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值