TLPI-Chapter 4文件IO
所有执行I/O操作的系统调用都以文件描述符(一个非负整数)来指代打开的文件。文件描述符用以表示所有类型的已打开文件,包括管道、FIFO、socket、终端、设备、普通文件。它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。每个进程,文件描述符都自成一套。 numread = read(fd,buffer,count) 读取fd所指代的文件中之多count字节的数据,并存储到buffer中. numwritten = write(fd,count)调用从buffer中读取多达count字节的数据写入由fd指代的已打开的文件中. status = close(fd) 改变文件偏移量:lseek() .通用I/O模型以外的操作:ioctl()、fcntl() ioctl() #include <sys/stat.h>
#include <fcntl.h>
#include "tlpi_hdr.h"
#ifndef BUF_SIZE /* Allow "cc -D" to override definition */
#define BUF_SIZE 1024
#endif
int
main(int argc,char *argv[])
{
int inputFd,outputFd,openFlags;
mode_t filePerms;
ssize_t numRead;
char buf[BUF_SIZE];
if (argc != 3 || strcmp(argv[1],"--help") == 0)
usageErr("%s old-file new-filen",argv[0]);
/* Open input and output files */
inputFd = open(argv[1],O_RDONLY);
if (inputFd == -1)
errExit("opening file %s",argv[1]);
openFlags = O_CREAT | O_WRONLY | O_TRUNC;
filePerms = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP |
S_IROTH | S_IWOTH; /* rw-rw-rw- */
outputFd = open(argv[2],openFlags,filePerms);
if (outputFd == -1)
errExit("opening file %s",argv[2]);
/* Transfer data until we encounter end of input or an error */
while ((numRead = read(inputFd,buf,BUF_SIZE)) > 0)
if (write(outputFd,numRead) != numRead)
fatal("couldn't write whole buffer");
if (numRead == -1)
errExit("read");
if (close(inputFd) == -1)
errExit("close input");
if (close(outputFd) == -1)
errExit("close output");
exit(EXIT_SUCCESS);
}
#include <sys/stat.h>
#include <fcntl.h>
#include <ctype.h>
#include "tlpi_hdr.h"
int
main(int argc,char *argv[])
{
size_t len;
off_t offset;
int fd,ap,j;
char *buf;
ssize_t numRead,numWritten;
if (argc < 3 || strcmp(argv[1],"--help") == 0)
usageErr("%s file {r<length>|R<length>|w<string>|s<offset>}...n",argv[0]);
fd = open(argv[1],O_RDWR | O_CREAT,S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP |
S_IROTH | S_IWOTH); /* rw-rw-rw- */
if (fd == -1)
errExit("open");
for (ap = 2; ap < argc; ap++) {
switch (argv[ap][0]) {
case 'r': /* Display bytes at current offset,as text */
case 'R': /* Display bytes at current offset,in hex */
len = getLong(&argv[ap][1],GN_ANY_BASE,argv[ap]);
buf = malloc(len);
if (buf == NULL)
errExit("malloc");
numRead = read(fd,len);
if (numRead == -1)
errExit("read");
if (numRead == 0) {
printf("%s: end-of-filen",argv[ap]);
} else {
printf("%s: ",argv[ap]);
for (j = 0; j < numRead; j++) {
if (argv[ap][0] == 'r')
printf("%c",isprint((unsigned char) buf[j]) ?
buf[j] : '?');
else
printf("%02x ",(unsigned int) buf[j]);
}
printf("n");
}
free(buf);
break;
case 'w': /* Write string at current offset */
numWritten = write(fd,&argv[ap][1],strlen(&argv[ap][1]));
if (numWritten == -1)
errExit("write");
printf("%s: wrote %ld bytesn",argv[ap],(long) numWritten);
break;
case 's': /* Change file offset */
offset = getLong(&argv[ap][1],argv[ap]);
if (lseek(fd,offset,SEEK_SET) == -1)
errExit("lseek");
printf("%s: seek succeededn",argv[ap]);
break;
default:
cmdLineErr("Argument must start with [rRws]: %sn",argv[ap]);
}
}
if (close(fd) == -1)
errExit("close");
exit(EXIT_SUCCESS);
} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |