writev.c

来自「一个C源代码分析器」· C语言 代码 · 共 65 行

C
65
字号
/* Copyright (C) 1991, 1992 Free Software Foundation, Inc.This file is part of the GNU C Library.The GNU C Library is free software; you can redistribute it and/ormodify it under the terms of the GNU Library General Public License aspublished by the Free Software Foundation; either version 2 of theLicense, or (at your option) any later version.The GNU C Library is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNULibrary General Public License for more details.You should have received a copy of the GNU Library General PublicLicense along with the GNU C Library; see the file COPYING.LIB.  Ifnot, write to the Free Software Foundation, Inc., 675 Mass Ave,Cambridge, MA 02139, USA.  */#include <ansidecl.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <sys/uio.h>/* Write data pointed by the buffers described by VECTOR, which   is a vector of COUNT `struct iovec's, to file descriptor FD.   The data is written in the order specified.   Operates just like `write' (see <unistd.h>) except that the data   are taken from VECTOR instead of a contiguous buffer.  */intDEFUN(writev, (fd, vector, count),      int fd AND CONST struct iovec *vector AND size_t count){  char *buffer;  register char *bp;  size_t bytes, to_copy;  register size_t i;  /* Find the total number of bytes to be written.  */  bytes = 0;  for (i = 0; i < count; ++i)    bytes += vector[i].iov_len;  /* Allocate a temporary buffer to hold the data.  */  buffer = (char *) __alloca(bytes);  /* Copy the data into BUFFER.  */  to_copy = bytes;  bp = buffer;  for (i = 0; i < count; ++i)    {#define	min(a, b)	((a) > (b) ? (b) : (a))      size_t copy = min(vector[i].iov_len, to_copy);      (void) memcpy((PTR) bp, (PTR) vector[i].iov_base, copy);      bp += copy;      to_copy -= copy;      if (bytes == 0)	break;    }  return write(fd, buffer, bytes);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?