下面我们学习一个实例,这个实例用来拷贝文件. . h1 V. a% d8 D
! q( @9 x3 o. j/ R#include
- x9 D( W& \6 r3 `#include
" Y# o. L4 s) f. ?; W* l+ w#include
6 s0 }5 e; W1 r4 `#include ) H% y$ {; m! u! i: m! @' G1 n. K( ^
#include
. x4 O+ O5 B+ j$ e#include
, P# Y$ b+ O; B- p$ T, ]1 s#include
- X- w: r0 m) G- b8 ?, A+ H
, f7 |. X9 ^, O& B3 }1 G8 Z#define BUFFER_SIZE 1024
' M' s& Y: N, i. g, T
$ Y8 S' h# H5 }" I4 @int main(int argc,char **argv)
8 n8 w" H& X7 F{
' ?- b" |( p5 i5 O, w: U3 [* A4 `9 h4 c, Y* A
int from_fd,to_fd;
! }& q0 s6 r" j2 K& rint bytes_read,bytes_write; % c3 U( W3 g5 u! G# H# ]$ E; l
char buffer[BUFFER_SIZE];
/ ~/ H [8 h3 [ v& R& ~char *ptr;
4 Y/ u4 }( u- K
G7 n0 ~0 {5 s! Aif(argc!=3) & s/ j C2 p) T# @
{
9 {: S7 _/ b% |5 ~' Y! mfprintf(stderr,"Usage:%s fromfile tofile a",argv[0]);
' E. [8 G) d9 @+ F$ e$ t6 W( dexit(1); 0 }$ M; n' X" a6 ?
}
1 ?7 g ]" }* w `3 q: I2 ] N5 B4 ~, i* F1 j: Q
/* 打开源文件 */
1 @# d. m; P* a3 i( {5 z6 Y- C8 }' F
; h4 a( T# {. ]- T7 t8 B2 ^# J8 mif((from_fd=open(argv[1],O_RDONLY))==-1) ! E! r S0 }: f0 t, o
{
: k! u% d) ^' w" |fprintf(stderr,"Open %s Error:%s ",argv[1],strerror(errno));
; O# _$ ]( j" P5 L$ Uexit(1);
; H) D* P/ R- l1 H! x0 J* Q}
: c) f) R" s( \1 e
. J* b1 q8 H I7 \: o/* 创建目的文件 */
" `4 u, J/ \2 D2 H* L% f2 H% s- y3 \0 N" F( T$ p
if((to_fd=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1) 8 b! h7 F1 `3 A6 F4 l
{ % k- R$ u- A( _0 q- _. v+ d3 F
fprintf(stderr,"Open %s Error:%s ",argv[2],strerror(errno));
: m0 X* v$ f- f+ ]7 Uexit(1); + r$ t( G8 ]; q6 t0 N, y$ P5 G9 _" G
}
9 L+ T% [, d7 F6 b9 l
: [7 p7 B) b4 A" a/* 以下代码是一个经典的拷贝文件的代码 */ . a3 ]" c. P, R3 |8 \. G
I3 h( b1 G" i3 ~5 P0 Ywhile(bytes_read=read(from_fd,buffer,BUFFER_SIZE)) & M1 R' E) N: x; W3 h
{
" Y* p6 F1 ?! T/ d' F/* 一个致命的错误发生了 */ ) W% ^4 P( B! W1 X/ j
if((bytes_read==-1)&&(errno!=EINTR)) break; 4 ?3 w. F2 V) I# e; K
else if(bytes_read>0) ) A" k1 ?. v# L' e
{ 1 E' p! j+ G! p
ptr=buffer;
1 J8 H7 Q4 U+ z: \while(bytes_write=write(to_fd,ptr,bytes_read))
4 ]% h1 |$ O- F{
- s) c; _0 Y0 t' _/* 一个致命错误发生了 */ / q% R/ x+ l; T, U. e, Y" r
if((bytes_write==-1)&&(errno!=EINTR))break;
2 X1 O, I: J+ Z v4 _/* 写完了所有读的字节 */ $ p2 Q$ ^ V! N2 ^8 N+ H
else if(bytes_write==bytes_read) break;
. H# G* ?3 [/ i/* 只写了一部分,继续写 */
- ?! Y, o7 s9 n$ Belse if(bytes_write>0)
$ y1 H" F4 b( I: u- ^{
) _& g: ]: b' ^' g4 [& eptr+=bytes_write; ( y# ]' _2 `: X' Q; ]9 \
bytes_read-=bytes_write; 0 x; k2 e2 j3 g$ ]
}
+ K5 S, [8 Q, a+ Y6 `/ R$ X' d/ h} 6 z' r2 t P; T
/* 写的时候发生的致命错误 */
, b, U8 Z3 n+ aif(bytes_write==-1)break; * `( v. L' a9 s3 @( g
7 L' P. t& l1 x* R9 t- x
} O- E" n8 e8 P% u4 n8 a1 W
}
1 a% B* T$ d1 {* s9 |close(from_fd);
0 T. N; x8 M& k3 \* E, k" G: `1 vclose(to_fd); . W6 P) Q- |: W9 q- V
exit(0); ) u7 n8 y$ e4 I4 r3 M
} 6 R4 Z4 d; c& _. Q( h. s8 ]
3 D; ?: Y& `2 W2 ` O% p3 h; T
( a+ k" z# p/ [# ]. r; T
* a5 ~" X& B+ O+ J: _请问这里main函数中的两个变量argc和argv[]分别代表什么?
* v: n2 {- a) A5 Y0 s* y1 x$ O5 E f+ `$ w* n& X
还有if(argc!=3)
7 S3 L; a0 n7 C{ 2 a' M& E9 ]/ j8 X' @/ N' e/ _$ e
fprintf(stderr,"Usage:%s fromfile tofile a",argv[0]); $ N6 w3 ^% Q: d9 x: L) E5 V
exit(1);
# D0 r- c8 a2 U7 s5 y k7 Q8 L} 0 G! b' [' e1 r4 I) ?. D
是实现什么功能的?
7 }4 ?! s4 |- c2 z8 U