下面我们学习一个实例,这个实例用来拷贝文件. 4 N- s: ?, ^5 S$ s/ ^' E; r
7 M7 j( I3 w \
#include
; f9 f# q8 S8 Y( v5 B#include
* \# b, A$ X v: |) X6 D#include 1 s/ ^0 \. e6 {
#include * F! g) o" J! b5 Z! A0 V
#include % F# l) A' D( l* U. ^9 K7 r& p
#include
4 n. [0 j6 t7 p- U3 j, D' o; H#include
8 g" n3 g5 }0 g( R. J5 Q% h4 u, Z1 f+ P2 y
#define BUFFER_SIZE 1024 - f7 m5 m8 t$ g ^4 k1 p5 G9 S
! y% N3 F" N- q3 c3 _9 M5 y9 z! }) }int main(int argc,char **argv) # I5 q) R7 W( c% {1 @) t
{
) c3 s+ I3 f) y! _4 Y8 }) d4 ^3 R/ d0 j4 H3 X, C+ r' {
int from_fd,to_fd;
4 G, d$ ]. ^1 f2 ~- Eint bytes_read,bytes_write; 5 X. `: d+ h5 z( ]
char buffer[BUFFER_SIZE];
" {6 \8 ?3 H4 B4 Z- N% f ]- C. Qchar *ptr; 6 P! Z) [, R$ ^3 S
' d0 _! \7 D' h5 i0 U$ b
if(argc!=3) , ~# H* [) V* m$ }2 Z
{
0 x' i2 C( f7 E h( Ffprintf(stderr,"Usage:%s fromfile tofile a",argv[0]); ( m$ V5 q9 C/ A! W1 F! N' O( C6 `
exit(1); % R V; ]8 B/ T( M% ^
}
6 I3 J% R3 J2 l0 r9 G3 V
4 G! v8 e6 h5 H' X& o/* 打开源文件 */ 2 d( U7 X" ?( l4 \( |/ E H4 M1 M! t C
% B1 J$ f9 S1 R6 H
if((from_fd=open(argv[1],O_RDONLY))==-1) - Z2 L) B* }( o) s' R
{
* @% J4 ]$ S# y. A1 h( p/ g1 A {! Zfprintf(stderr,"Open %s Error:%s ",argv[1],strerror(errno));
/ ]5 b/ N7 _! v( v+ Texit(1); 6 R7 z$ m1 ~8 G% S% Y, ^ r
} 3 z7 r& u# n- K) j: R
4 C8 [( K" X8 [
/* 创建目的文件 */
1 A( U# y% E' W1 y) E' Q# M" d/ |+ D/ d0 t+ m& i7 S7 j
if((to_fd=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1)
. w1 e! t \7 d0 X$ ^{ 6 J' [1 ~) q; n, G" C
fprintf(stderr,"Open %s Error:%s ",argv[2],strerror(errno));
: G$ @8 v2 R `1 Cexit(1); ' U% Z2 Q+ `& G: m6 s
}
, [* F) v( w" L+ z2 {6 f8 `' O- i
/* 以下代码是一个经典的拷贝文件的代码 */ 9 Q7 j; _7 u+ ?( L# G* z$ {( g o+ X& [
% P: d6 k# f7 Z2 d2 S+ N
while(bytes_read=read(from_fd,buffer,BUFFER_SIZE)) 9 x: f2 a0 J: P l
{
, r/ \( k; Q3 {' D/* 一个致命的错误发生了 */
4 ~8 E5 j0 [# o" P: [$ D4 iif((bytes_read==-1)&&(errno!=EINTR)) break;
6 E, `7 z8 @3 \2 B- w/ welse if(bytes_read>0)
, [! }7 d/ q4 ^1 F{
% \* c( U, Y$ Optr=buffer; # o7 U' _! D2 Q8 J
while(bytes_write=write(to_fd,ptr,bytes_read))
# P) K: Z# Q* p1 v, S0 n{
# {, }; |6 X [9 v( a/* 一个致命错误发生了 */
) I1 f4 @4 F$ j+ Q7 p+ x x: Wif((bytes_write==-1)&&(errno!=EINTR))break; . h; @( { M/ y
/* 写完了所有读的字节 */
, ^! _: X$ c- C9 C8 ?$ W" Yelse if(bytes_write==bytes_read) break; # o8 y p* g2 }+ K# d- {
/* 只写了一部分,继续写 */
6 S0 J4 W. a8 x6 ~else if(bytes_write>0)
1 {5 o8 k' y2 l9 \* n{
+ v, ]8 W. I# D+ j- M" X2 Hptr+=bytes_write; 6 \; {2 O, e, A0 u; y) {% ^
bytes_read-=bytes_write; & A: Q: A& A3 `' y3 Q; T9 n" t
} 4 J" g4 J: x3 c+ l2 F
} ) a2 k7 d2 t; q
/* 写的时候发生的致命错误 */ # u0 _2 r% \: R) U
if(bytes_write==-1)break; % x! R1 P% _0 R$ C
6 t2 s' K$ ], R% \; k y}
9 z0 B0 l' S: s5 _} , K9 l7 q9 ?2 y+ a0 t6 k- p4 B) c
close(from_fd); * O W7 ]& D- g) P9 Q8 v: D
close(to_fd); * w2 r" Q" b U* W7 u# |7 u4 M
exit(0);
* l' Z7 f0 d+ v1 ?( V- v} ; ~! D1 ?; g( w& P
" {6 V* W. c: O4 b, \
0 K* c7 p. G( f1 F' H+ U
( D& y- W. R5 h& E' d
请问这里main函数中的两个变量argc和argv[]分别代表什么?7 M2 r/ k/ z6 y& |
$ x+ ~" n' u! G. _% D还有if(argc!=3)
3 t/ z+ Y9 e% Y6 I{
6 H: {- K% D8 o3 C/ {1 S, Efprintf(stderr,"Usage:%s fromfile tofile a",argv[0]);
) [% _: ^0 L ^4 Z" T5 t) V Aexit(1);
. P0 C/ H3 A0 o}
! F3 L- A/ ^0 u# w H) M2 v4 q是实现什么功能的?
4 Z3 A: _+ l- e7 m9 Q6 `
--------------------next---------------------