我是大帅哥,擅长LINUX和C语言,还有脚本,希望和大家交朋友 QQ:21488275 MSN:chenkuo2006@hotmail.com

《linux实践教程练习题及答案》待续

2007-11-27 00:01:11 / 精华(2) / 置顶(2) / 个人分类:C语言编程

2.10)从who的联机帮助中可以知道who am i也是可以接受的形式,同样还有whoami,修改who2.c,使它支持who am i的形式.阅读whoami的联机帮助,看它与who有什么不同,编程实现whoami. LUPA开源社区8d ^ O0on2|;c#U
 LUPA开源社区 Ud1c9KD
答案: LUPA开源社区c v'WN0MhT
 
;F&hb z`-w^0 LUPA开源社区]Sp$hsY
1)第一题,问支持who am i,即要提取utmp中的当前用户,而utmp中的ut_pid存放着当前用户进程与getppid()函数提取当前程序的父进程 LUPA开源社区l@V9^*[Q&^
进行比较,如相等,说明正要当前用户,则显示出来即可. LUPA开源社区}(~~3Rl[ X/xpX
 
$g])i"H0|[R0# include <stdio.h> LUPA开源社区\6SC/Q0tJk
# include <unistd.h> LUPA开源社区f q_A&ki H3QHf
# include <utmp.h> LUPA开源社区)|;mO xb
# include <fcntl.h> LUPA开源社区*qA4C%c } Tt
# include <time.h>
ik S9K Y&xv0# include <stdlib.h> LUPA开源社区Sg[2r+PT#P@![G
 
VUP'{P0IV0 
iqQW+]%H-sY~v0 LUPA开源社区 L!e`S+I#S#mPd
# define SHOWHOST
G;{x en9W%j0 LUPA开源社区%o8Y,uwl5FgR
void showtime(long); LUPA开源社区}A1Z Z k
void show_info(struct utmp *);
8xH#Ab;T3P|1b"v(@0 
nnS.G'ke0b\0 
2Ph"wXu[A0 LUPA开源社区_&h U,f.v6V)Iz
void show_info(struct utmp *utbufp) LUPA开源社区WS L Y O v6y
{
+x[kb6J0    if (utbufp -> ut_type != USER_PROCESS)
F2r'MN,Q0    {
g^D i7U;~0      return; LUPA开源社区)xF-uE u^
    }
;eN N9]+yi9d'E9x7J?0 LUPA开源社区*O8g6G P Q8D1Ru
    printf("% -8.8s", utbufp -> ut_name); LUPA开源社区%e(O'V(J:g]'T c-LM
    printf(" "); LUPA开源社区K N_\q$UH
    printf("% -8.8s", utbufp -> ut_line);
~.Yx:\Pwg0    printf(" ");
oQs'b1].P,x'@,_.i$L0    printf("% -8d", utbufp -> ut_pid);
1Q,? {gh&I0    printf(" ");
Uvq6N(s??7osi0    showtime(utbufp -> ut_time);
B1Fu d7Lt8doq+X`.I0 
]]Bd'|]0# ifdef SHOWHOST
Z]A2S4c$f'dD1} t0  if (utbufp -> ut_host[0] != '\0')
`VG)`9o0    printf("(%s)",utbufp -> ut_host);
4Ge6Vr$?%M0# endif LUPA开源社区m{W|y)x5k
 
:Y0w F t"p akE0    printf("\n"); LUPA开源社区n6L1NYv1@C*shv
 LUPA开源社区 Y,mBWqq@W1t
}
9W#cY8W2trm&M;q+g0 
C1EC/v){(n:oP0 LUPA开源社区Ny7`6o3D!]
void showtime(long timeval)
G/eJB?o0{
1{JZ G|\`0    char *cp; LUPA开源社区 {-x GNB&g_
    cp = ctime(&timeval); LUPA开源社区ke|3NM_9KI
    printf("%12.12s", cp+4);
2BH_ hRP_ D@0} LUPA开源社区6t,Z2a'^W(_C{]
 
GH;H0v.] Gio&r0 
]U Y8mzn0int main()
eJYV H [0{ LUPA开源社区"cvPfl1`U!f M
    struct utmp  utbuf; LUPA开源社区.q4Y9b7se
    int          utmpfd;
Y/a'VD%z|[]V0 LUPA开源社区SJ_R m/f
    if ((utmpfd = open (UTMP_FILE, O_RDONLY)) == -1)
Eo:@X2z0    { LUPA开源社区 Cn;R7X;N8ip
      perror(UTMP_FILE);
8Ijj3t/e A{Y0      exit(EXIT_FAILURE); LUPA开源社区|U"|4H pi
    }
(y!xi ]q7J)R YA"i'N0 LUPA开源社区 x&u!{p@8B Li
    while (read(utmpfd, &utbuf, sizeof(utbuf)) == sizeof(utbuf)) LUPA开源社区Da$c t.k
    {
n N F1vk"m8t jr0        /***********主要修改部份************/
1i@ U(u)}9K n[/u&TvE0        if (utbuf.ut_pid == getppid()) LUPA开源社区s Z6U6H2|:P
        /***********************************/ LUPA开源社区DF)rShR
        show_info (&utbuf);
$JyF%Z#w/]]0    } LUPA开源社区q7}:q)]9n8C
 LUPA开源社区_1b8a#AMH%E9[
    close(utmpfd); LUPA开源社区)l)dU8B{
    return(EXIT_SUCCESS);
|'TRW2VLw0} LUPA开源社区d^4tyl
 LUPA开源社区7j jro$cDPE T7f
 
8^ih1xi+L+|iH0 LUPA开源社区KRx$c9ADlo
/******************************************************/
R5vj1x_~0 
)G3{NP3V7mF02)接上一题,whoami只显示用户名,即去掉多余信息,只打印用户名即可
4Rf,okK0 
@ QI5R8sdA0# include <stdio.h> LUPA开源社区j3o o1J{}9I
# include <unistd.h> LUPA开源社区3K{Q2R|zE]
# include <utmp.h> LUPA开源社区z$WIy']We9HI8]
# include <fcntl.h>
,_Mv LY&~2t|0# include <time.h> LUPA开源社区 ]iy/Y%v,A-b8{
# include <stdlib.h> LUPA开源社区FP M(f&{i RNK
 LUPA开源社区Hh%E2u b%h!f:nqQ j
 
,{0If5sh ^*E c0void show_info(struct utmp *); LUPA开源社区qa|'A{
 LUPA开源社区(qgG+Wy^khi
 LUPA开源社区kcM+C!v U(jo)m~"|
/*********主要修改部份***********/
l\ WD"U0void show_info(struct utmp *utbufp) LUPA开源社区g.f zlf
{ LUPA开源社区D9g IRsF
    if (utbufp -> ut_type != USER_PROCESS)
T vQLbv.B.\y(q0    { LUPA开源社区(c2[@X"K[@ d
      return;
?+zx)xrg{Xu0    } LUPA开源社区1~b)L.^ mYX V
 LUPA开源社区m3h/cd.q!VW0I0gI
    printf("% -8.8s", utbufp -> ut_name); LUPA开源社区 i9mV/sD*J!~Jug
    printf("\n"); LUPA开源社区,G BApD7q*_X
 
+Li J7x f0}
+r3` \`8}pI0\_0/********************************/
[ bfYn0 LUPA开源社区%Jih-zb
 
,T!G(O:}!`l1Zp']Z1`z0int main() LUPA开源社区;E@*H NZ4h!i
{
~G0AL+n l Cq6T0    struct utmp  utbuf; LUPA开源社区h(C3D2{4f8S CY
    int          utmpfd;
iXN\!p-t0 LUPA开源社区'Q}(wm7K!Ib^ C
    if ((utmpfd = open (UTMP_FILE, O_RDONLY)) == -1) LUPA开源社区0ln ~QJ*x
    { LUPA开源社区'I`1E x*xW9Y:X
      perror(UTMP_FILE); LUPA开源社区;Smx?2@QC r
      exit(EXIT_FAILURE); LUPA开源社区 ?]#W*{,X z0KB2w
    } LUPA开源社区q5`&{rtU6I n_
 LUPA开源社区B9zi)u/b
    while (read(utmpfd, &utbuf, sizeof(utbuf)) == sizeof(utbuf)) LUPA开源社区dV0w n7m1GL/L
    { LUPA开源社区bG`)m}/}l
        if (utbuf.ut_pid == getppid())
L$L_'G J0        show_info (&utbuf);
([ a5vtDb0    } LUPA开源社区T%u1E A-@
 LUPA开源社区C.i/XaH8i1[P(}
    close(utmpfd); LUPA开源社区;mz ?7~2VTO!f
    return(EXIT_SUCCESS);
?EAee dSE0}
\7G opP,|r a*AF0 LUPA开源社区qm+YF2\-d
 
S^/~aCv*S0 LUPA开源社区4Hhq'GD0b2x W!P
/**************************************************/
+Vn9Z\Dym0 
]q d4A~0 
(ci?-]v TE%D02.11)使用标准cp命令时,当原文件和目标文件相同时,会有什么结果?修改cp2.c使之能够处理这种情况.
r$QK*Ih M0 
7T vGG:f;m.`0 LUPA开源社区%P$K-xE9D qjN;K2Y'k
解答:当相同时会提示cp: overwrite等,这时用户选择是/否覆盖 LUPA开源社区 ?,TW.C+Q5^
这里的编程思想是要判断目标文件是否存在,如果存在就会提示覆盖
;A~,G8O*U6kN b0 LUPA开源社区e4n6S#k)z0]v
# include <stdio.h>
:~R JsQ4I1]BO0# include <stdlib.h> LUPA开源社区p6c{tq)QC@r(bu
# include <unistd.h>
:n4Qg#q*s&h/cU0# include <fcntl.h>
8B:X7]~d(~"F d3xeFS0# include <string.h> LUPA开源社区`:imO&I/T`o6O E7T:^0k
 LUPA开源社区Cu8G!^^b
 LUPA开源社区*q+X x'}j6p.z
# define BUFFERSIZE    4096 LUPA开源社区'l0\&YI6?P4D]L {L
# define COPYMODE      0644
h ~Q"C9p0# define ANSWER_WIDGER 4
1IlV(JDf0c0 
8Cy SVphb0void oops(char *, char *); LUPA开源社区xK8jzz~[7?M
 
X7J6N a!d$O?o0int LUPA开源社区%N'BVM?ww!`
main(int ac, char *av[]) LUPA开源社区%t:_S MQ1O%}7Af
{
sE9|5R@zn0    int   in_fd,out_fd,n_chars;
5JTY0uqz4C8M0    char  buf[BUFFERSIZE]; LUPA开源社区 i lr],s)BZ-i
    char  answer[ANSWER_WIDGER];
Y n#_2EE0Q0 LUPA开源社区V|1`+mfX1a
    if (ac != 3)
NcwE4]tL4u2{0    {
9^%J8l0B-{I]0      fprintf(stderr,"usage: %s source destination\n", *av); LUPA开源社区 ^Zj'j Z}
      exit(EXIT_FAILURE);
];lW`v!S0    } LUPA开源社区U w{Z].~#q%j+c
 
kaKC0b6oh)lT0    if ((in_fd = open(av[1],O_RDONLY)) == -1)
b\5i6kuw0    {
q`+li}JG a;Y"h(x0      oops("Cannot open ",av[1]);
n5R)yK b$u,qSQ3K,Y0    } LUPA开源社区7B't)jmb&Q!iUq
 LUPA开源社区9W"vX7Z1n3{*q@FS#M
/*********主要修改部份**********/ LUPA开源社区xC;Q-~Z3^
    if (open(av[2], O_RDONLY) != -1) LUPA开源社区,V`:If2b
    {
1P1k!a4sV;[bD1N0t0      printf("cp: overwrite `%s'?", av[2]); LUPA开源社区Zx3K?:e^&Xl
      scanf("%s", answer);
1V+uZ7q g*d0      if (strcmp(answer, "yes") && strcmp(answer, "y")\
T&w4j!z%wn"[$D!`0          && strcmp(answer, "YES") && strcmp(answer, "Y")) LUPA开源社区$vT4[$[L$SG*g
      { LUPA开源社区7kG0urB'^y
        exit(EXIT_SUCCESS);
/T/dj:Y(psY b0      } LUPA开源社区'_RS"T0E(W
      else LUPA开源社区k,RiF'c7W
      { LUPA开源社区2@P'B"lF wT2_ [+D
        if ((out_fd = creat(av[2], COPYMODE)) == -1) LUPA开源社区(V/Y(X-q O
        { LUPA开源社区;S s Wr ? YC FBIaC
          oops("Cannot creat",av[2]); LUPA开源社区.@O:\T3\9W_
        } LUPA开源社区n \yd8h
      } LUPA开源社区NNPw2M"T6T
    }
(Rh[*x ]0    else LUPA开源社区[;IY1B;Q2X kL6qF8FU
    { LUPA开源社区tWkk {K
      if ((out_fd = creat(av[2], COPYMODE)) == -1) LUPA开源社区_m;t5| e,R3H},O$om
      { LUPA开源社区#f-O1{ \?2u
          oops("Cannot creat",av[2]); LUPA开源社区'L@7O;m1C[!V,^h
      }
Mf@]"[-[tr2N0    }
c1V%T L/`O$a7B0/*****************************/ LUPA开源社区W#{5]r{lf
 LUPA开源社区3RA/nB4n
    while((n_chars = read(in_fd, buf, BUFFERSIZE)) > 0)
x#ky6WWT!x0    {
bGh { ]vlp0      if (write(out_fd,buf,n_chars) != n_chars) LUPA开源社区7^)|4O%}(c a*FgX
      { LUPA开源社区`eV$^cv&r
        oops("Write error to ",av[2]); LUPA开源社区Uh XfmS z0?
      }
$e6qG*HJ5_3};n0    }
k6N'FLF7F2xX;S'gB0 
s1Q |u3uI ]$W0    if (n_chars == -1) LUPA开源社区#[%uo*D&KL'e,`N)y-h
    { LUPA开源社区Y}-sVm'R J-K:}
      oops("Read error from ",av[1]); LUPA开源社区%Z?&aj1cP/v*of
    } LUPA开源社区7g8]sL2{cK
 LUPA开源社区K)m|y-R
    if (close(in_fd) == -1 || close(out_fd) == -1) LUPA开源社区!Q+z"\5kd7f'Bg
    { LUPA开源社区-]-Xw?jf
      oops("Error closing files", "");
,p/n,yMn2F0    } LUPA开源社区:di8y7r/]Et2j
 LUPA开源社区H4Of6Ar.S{`
 
O-ZL9] ^$A6}`L0}
:]] FjC.P%r|0 
g,^'TZI K#G!B,w"l0  LUPA开源社区d+_;T@$r4f+r
 
aE!iN@z0void oops(char *s1, char *s2)
NA)Yv\8rzBm0{ LUPA开源社区 BY6SABND9hY
   fprintf(stderr,"Error: %s ",s1); LUPA开源社区['_2Px4N\w$D(Z
   perror(s2);
[6D sz.w1CpOW0   exit(EXIT_FAILURE);
6| l)U!lq!vjd`0}
9g+?.o"tI Zl{ Lm0 
mU6J8o/T0 
*o*h8@ W1]0`0 LUPA开源社区8P!Lo]2G,udJc
/**************************************************/ LUPA开源社区#}#\7X O!D6[ }hNS
2.12)在utmplib.c中的几个函数是为了提高utmp文件的读写效率,调用这些函数,每次返回一个utmp记录,
2V{Q%~ f0m%G?[%?8ot0有时返回的记录中可能不包含任何有用的信息,修改utmplib.c,使每次返回的都是有用的信息。这样做会影 LUPA开源社区E3j7s ?R1BMs*`
响到who3.c其它部分的代码吗,为什么?
q2}@m'Lb+q0 LUPA开源社区3@CK,@DntE)T
 LUPA开源社区]b"P5u t7nyd%L{o
答案如下: LUPA开源社区ot:og9q7`5j9_
 
Z0Ic9qck0 
nRXi ].cEN-W0who3.c增加如下代码进行判断: LUPA开源社区.R7EO#@~A@]1_
if (fail_flag == 1)
-^ R7_T6C4D0{ LUPA开源社区2Z` hr!gI(n
        fail_flag = 0;  
.?#n9Zru0        continue;   LUPA开源社区:j f,Zt`PtG
}
nr2E'K$|Q2RB0 
y4Jt J,D3Ug0utmplib.c增加如下代码进行判断:
-Xbio/b0 if ( recp -> ut_type != USER_PROCESS )
5JtZ)WP.{7moH0    { 
+dKvr fwZ#d0        *fp = 1; LUPA开源社区0w[3^!i `#_a.Vs#C
    }
)k7lF"e8R2g0 LUPA开源社区ayX z)Px
 
Q2HZ9U|0/*  LUPA开源社区 x&K$u}0t#?Z"r|
 * 源文件:who3.c LUPA开源社区)q"}W9Y(Xt!@ F
 */ LUPA开源社区I5|za$K W/Y"U3^
 LUPA开源社区Dz"G shcoVS
# include <stdio.h>
`*w}^AG0# include <sys/types.h>
%G-]*Hz"z p0# include <utmp.h>
2D[vG.?0# include <fcntl.h> LUPA开源社区8E}}h@ SL2j ~
# include <time.h> LUPA开源社区R6Y-{s$O7b3tkj
# include <stdlib.h>
[e'm+S#L'WR.~0 LUPA开源社区 ^6N.^"e&k3C m z
 
XFpS&{6_/F B0# define SHOWHOST
C+V(p6W7k2b.[{o^0 
!c*cS6L C)L*[0 
*u(N t5](b0qK0void show_info(struct utmp * );
nf a([c%zB Q Oy0void showtime(time_t); LUPA开源社区8@"{|5c}I[0AKo^b
 
Y"f6a!~j4`-?ePw0int 
aY7E:\!z9a*c4s(j0main()
n7VDh6z7d0{
pNl ~ XklV r0    struct utmp *utbufp, LUPA开源社区2f{6uV r6L7N,aYUa
      *utmp_next(); LUPA开源社区h?!uK)G%^B;A;y
    int fail_flag;
:yF}](ILC.YI |0 
Hbc!QYt'Vn0    if (utmp_open (UTMP_FILE) == -1)
M/vX1qFg`0    {
qpWim Y_R:_']4~0        perror(UTMP_FILE);
.E8{!p^}S.L0        exit(EXIT_FAILURE);
4n r2rxTH_0    }
4\%\O&mW{Mw0/************主要修改部份*************/ LUPA开源社区&J0wv;w4E#R4A J
 
y~A,_["fON0    while ((utbufp = utmp_next (&fail_flag)) != ((struct utmp *) NULL)) LUPA开源社区f:h{P2k*P0o,c
    {    LUPA开源社区2UY-O.[0U
         if (fail_flag == 1) LUPA开源社区Dp*NQe*Zz{ ` k
       { LUPA开源社区1@4ar2O.X}kPn8s&ZJ
            fail_flag = 0;   LUPA开源社区8t4M3sQ m0E&l;zvzO
            continue;   LUPA开源社区e6AS{'lO
       }
2b7]v[X{d0        show_info(utbufp);
bX&`&~'SJ0    } LUPA开源社区9U:U2G7]\
/************************************/
2~ SQ.j5@a2?z4gg0 LUPA开源社区%[q ~Cg%o ~? {
    utmp_close(); LUPA开源社区h9mQ&t)\'KD w
    return 0;
Sh.C"bx\0} LUPA开源社区{Os5r p]^
 
?,V8}B?4Q}.y~0 LUPA开源社区g'A/[(k:tq%V$s
 LUPA开源社区4s4b7Q fq-V!Uy9V
void 
2E^)zdq#Dqk&j0show_info(struct utmp * utbufp) LUPA开源社区6G"l#c8R,Bg-Y D
{
g HQiN-X } w0     LUPA开源社区+K\{s,ASu
    printf("% -8.8s",utbufp -> ut_name); LUPA开源社区Y3yJP ?
    printf(" ");
8URC ?'X7^4]5T0    printf("% -8.8s",utbufp -> ut_line);
:c0eri)aY/yZ0    printf(" "); LUPA开源社区,|6Ww&` a
    showtime(utbufp -> ut_time); LUPA开源社区1e#c+oVc'p!d5A2~.\:v
 
0Le+{i;v:M7{aA0#ifdef SHOWHOST
}]S/o4wm0    if (utbufp -> ut_host[0] != '\0') LUPA开源社区+fX wJ+b;m-j
    {
?B0WdD fu0        printf("(%s)",utbufp -> ut_host);
(h.c-BE5M:K N.k0    }
aUR9L df4T0# endif LUPA开源社区M:z"ZkFWr
    
$jGU[j%g]0    printf("\n");
/J l.c"y r5@8v0} LUPA开源社区T*|#^6g-D@"E*@)n
 
[,N3dK~s0 LUPA开源社区/zogg ]\
 LUPA开源社区c1Q)~9u#Z$h I
void
H,cC+w7Z Kp]*w0showtime(long timeval) LUPA开源社区4Z{0G3AqnU%B-v
{
.u8L;N.}+`Q!h0    char *cp;
VM8qe_b(p0    cp = ctime(&timeval);
.e4vFo9x6a0    printf("%12.12s", cp+4); LUPA开源社区H6L c%Z7T-`
} LUPA开源社区+lE0y*O,I
 LUPA开源社区:|g(C&{%D,s ]5o&[
 LUPA开源社区Yg)|2B{-o,P#?2_/Z
 
&_%L!XTn^S0 LUPA开源社区x`&qf+e%I GFi~6q
 
,G_\2cR0u0/* 
(f4pxwH7D0 * 源文件:utmplib.c
*{A([6~1]`6oL#^|0 */ LUPA开源社区"q#z3i3{+c)sKhe8oD lY
 
Iv.fN7\)kE0# include <stdio.h> LUPA开源社区+[p?+T:}!uv
# include <fcntl.h> LUPA开源社区~dW!n y5sh;v
# include <sys/types.h> LUPA开源社区 vpvJTiA.]
# include <utmp.h>
V^*f9A Rt0# include <stdlib.h>
x.{Kc3vp Q$\@0 LUPA开源社区8r)x hG9WA
 LUPA开源社区v,eJK0Kj(u
# define NRECS 16 LUPA开源社区 u8ksE#C1C/]:x
# define NULLUT ((struct utmp *)NULL)
:I~q\&f4n0# define UTSIZE (sizeof(struct utmp)) LUPA开源社区2X3l-gN&vH
 LUPA开源社区Y0Kv xodk
 LUPA开源社区NU*oz+gt8@ j)y*S
static char    utmpbuf[NRECS * UTSIZE]; LUPA开源社区5i*c(Bq-s5eMkm E;`u'Y
static int       num_recs; LUPA开源社区 V"W4k+k1S| @ m
static int       cur_rec;
eNP \HDc0static int       fd_utmp = -1;
4\7ZmY4g chf0static int       fail_flag;
3kX]^ N0 LUPA开源社区j[em0x^v4t,w
 
%o n3Zz'c$J3V2g6W8E0utmp_open (char *filename) LUPA开源社区OuZ(x?2P3nL
{ LUPA开源社区B5v1K.m3TW8]?m
    fd_utmp = open(filename, O_RDONLY);
nd T7mQuo0    cur_rec = num_recs = 0;
)@@x)F;\ a n K1O-U0    return fd_utmp;
+RPhW jj0} LUPA开源社区#d-L5EMx3B WC Gf[
 
ED%J1C8`o0 LUPA开源社区 }u f6qB J
struct utmp *utmp_next(int *fp)
5}nXo.@9\[0{
K*XJaT%\4i^b7r:ju0    struct utmp * recp; LUPA开源社区 M MBLl@
 
r!?d-t*f0    if ( fd_utmp == -1)
N5d ]0k3R#h0       return NULLUT;
h S l U,K,g0    if ( cur_rec == num_recs && utmp_reload() == 0) LUPA开源社区+m7v:f9y%Qz)Y$T5N)a,JA
       return NULLUT; LUPA开源社区)RY5H*p9`?
     LUPA开源社区Vxw oCz Jk@bq
    recp = (struct utmp *) &utmpbuf[cur_rec * UTSIZE];
Ue7ZV]F0    cur_rec ++;
'a4J y|(w Fv0    
lXMM;q6]@x0    /**************主要修改部分**************/
F~0@vd3p4a J0    if ( recp -> ut_type != USER_PROCESS )
/JrEltH*Nq!zG0    {  LUPA开源社区(U^,E;~3p#h
        *fp = 1; LUPA开源社区d;ET:ni
 LUPA开源社区,q2Ts6L uZ-RW$a q"v
    } LUPA开源社区 w&Yf:AK+iN
    /**************************************/ LUPA开源社区"H!d2W(o'h3rV
    
5vIY:PEYc0    return recp; LUPA开源社区5X-I&y Qr moVh
}
x|V p G(["?3c0 
'tVbq-x0 LUPA开源社区*hJ$Rq|)B
 
N;j XJ{{1eq \0int utmp_reload() LUPA开源社区"c!A V&i)|
{ LUPA开源社区3fT0z&Wi
    int amt_read; LUPA开源社区SV7A%H2c
    amt_read = read( fd_utmp, utmpbuf, NRECS * UTSIZE ); LUPA开源社区VV"^$L Uw%P*}
    num_recs = amt_read/UTSIZE;
7w^%e*I)O k0    cur_rec = 0; LUPA开源社区:yY u9O8}?;yu
      return num_recs; LUPA开源社区*?KMxC`/p2F`'vR;J
} LUPA开源社区 _/c-i|E9r
 
%[LfaN]tb'o2~0 
+gwkNu;H(Ic$F0utmp_close() LUPA开源社区U Y!nc$R*V
{ LUPA开源社区w;y` YC%f+^M
    if( fd_utmp != -1) LUPA开源社区nj1td:KnH u|`
      close(fd_utmp); LUPA开源社区'v9ata,m'N3G&X,N
} LUPA开源社区Sw0^8\(xQA
 
/kS"F7j;?c0 LUPA开源社区L!P#F0e(p#k.A9X
 LUPA开源社区2_I|D#LP1I
/**************************************************/
)`_;B;s2c+[02.13)利用logout_tty重写当前记录,要用到缓冲技术
7q$_wB#dWu0 
)x!J_ h@ `n+R;V0 LUPA开源社区u#^I*N1w%s8M9m
注:以下我没有用到缓冲技术,因为可以直接重写,也没有用到utmp_seek
Zvb W@-E'p0 
X6jrd^z0 LUPA开源社区PUf)O+PB
答案如下: LUPA开源社区4q1_I&W:_
 
(ltGR9j+j#Sk0{_0 LUPA开源社区eX$_)IOW8c7x
/*主程序main.c*/
G kze D0u0/*即PID相同,就调用logout_tty,即在utmp中注销*/
6a \-y:|f@5OJ0 
%y bQ h{U!ej0# include <stdio.h>
\}|-G/P;AiT+N0# include <sys/types.h> LUPA开源社区 T ~g2MM
# include <utmp.h> LUPA开源社区u:AO%]9Zqv%|
# include <fcntl.h>
1[pe8UZ Fn!v:RT0# include <time.h> LUPA开源社区h7\nh@x,q#C
# include <stdlib.h>
;u-@{Ud5ZI0 LUPA开源社区7n&q1]-U"u:v/~,QC9^~
# define SHOWHOST
+N6mb*hmQ0 
4D$F v-t6@ Y$u0void show_info(struct utmp *);
WS_"|&R;u T0void showtime(time_t); LUPA开源社区 p$tvW$q8t-[^
int logout_tty(char *line,int count); LUPA开源社区rZPLe pa0y
 LUPA开源社区F ab V"O&{:p+yA
 
T._]'A]c6e}(YA0int
qbD"e t0main (int argc, char *argv[])
0s DTF"J$l7A"y0{
MW'@y XB0    int cur_pid;
MXG0}\6s0    cur_pid = getppid();
m@#I%N ZAW!['[j0    struct utmp *utbufp, *utmp_next();
5^*ANT6[+NI A0    int count = 0;
:E'A'cr2nn'O0 
-@*C7GFjC QHN1j d0    if (utmp_open(UTMP_FILE) == -1) LUPA开源社区(|#CtS5xGZ
    {
o$p&VN"Dll M*y0      perror(UTMP_FILE); LUPA开源社区4Q{-R,W[
      exit(EXIT_FAILURE);
cF"\ b6u:y_0    }
9J"t4ES#lU-tJ0 
;HEM;[|/V0    while ((utbufp = utmp_next()) != ((struct utmp *) NULL)) LUPA开源社区2H9w/H J |8sO)A z
    {
q/R!p'[rn0       if (utbufp -> ut_pid == cur_pid)
Ry;j"gCh.l0       {
H/K?2y0F6q&[0         logout_tty(utbufp,count); LUPA开源社区'I6G&} p|}/g!I@
       }
d8O2\6TE%j)i0       count++; LUPA开源社区~,W#ag1s+s,? f
    } LUPA开源社区vTska'V
 
w/nS |.e9v0n1V0    utmp_close();
R i8[AY0f3s:a0    exit(EXIT_SUCCESS); LUPA开源社区 HK Pk+tU vW+\X
} LUPA开源社区i5Sr{a'W1Gj0|2Z
 LUPA开源社区7j5^.NK'S,~k*f
 
%QO lvz0 
7Fmt.BR A8x |Sf0/* 
"uy@,i d-wLn0 * 源文件:utmplib.c
Xt"M!d6`D)U0 */ LUPA开源社区2[*M ~D*vdh ?
 LUPA开源社区S-Q}1Z4t"_0M q|+M
# include <stdio.h>
VV O!K7P?`)v&o0# include <fcntl.h>
F A$}Xp TSvc5N-c0# include <sys/types.h>
)[a k DG2F$a,`0# include <utmp.h>
F0Nk*H#\aPM:X0# include <stdlib.h>
j'pZo-Z0 
#B3O$R%\3c L3~0# define NRECS  16
0Q6p~R'R7l0# define NULLUT ((struct utmp *)NULL)
{X-@c M d+V,q0# define UTSIZE (sizeof(struct utmp)) LUPA开源社区P\BW?`
 
1xu9u bT M-H_0static char  utmpbuf[NRECS * UTSIZE];
y2|IZ-K(l4xx0static int   num_recs; LUPA开源社区hv%Ae1PZ$D
static int   cur_rec; LUPA开源社区7c_ ]q n9J
static int   fd_utmp_read = -1; LUPA开源社区{VV@5e&wu
static int   fd_utmp_write = -1; LUPA开源社区qU.Y-A q/K(w/H)k
 LUPA开源社区 U7?j ^"Y%bA
utmp_open(char *filename) LUPA开源社区@ Cz} C/M$wXj
{
`@ K#i6?&i?I0    fd_utmp_read = open(filename,O_RDWR); LUPA开源社区!~LwP ~T
    cur_rec = num_recs = 0; LUPA开源社区K%g eK_,c
    return fd_utmp_read;
g!S,|4T ?0}
c#K'y-z&e0 
,d*E3g*uK~O6S"TH0 
_0O(Z9F*_$Jh4O0struct utmp *utmp_next()
}&M$\MY-m0{
gr0yhS0    struct umtp *recp;
MJn8]S_H$o&_0 
E.BSi ?;IDa0    if (fd_utmp_read == -1 )
(z/IO3D p*a|E0    { LUPA开源社区|7Df1I.T4z)jS
      return NULLUT;
?&_dg*qC/e5xh(_0    }
TUQ%P0k0h l0 
W+eo*Xh0    if (cur_rec == num_recs && utmp_reload() == 0)
} i)MaK0    {
-E;D]lo0      return NULLUT; LUPA开源社区k)NkO%k)Q[
    }
3u,cX b$?2a/Q+D8~0    
Y;GH/z0[R$g'tK0    recp = (struct utmp *)&utmpbuf[cur_rec * UTSIZE]; LUPA开源社区g ]N.\Da1h
    cur_rec++;
5~U!L9F m Qe&Nz/b_d0    return recp; LUPA开源社区v6x;f-Q'T!L
}
#s"UM|H,x0yi0 LUPA开源社区j5T2H fV_7o'g?5P^Fs
 LUPA开源社区;h'dD6PWGIG
int utmp_reload()
j~4Q0pE0{ LUPA开源社区/S1P#eo`3?\uq _n
    int amt_read;
'{4|)DX]];z q8w0    amt_read = read(fd_utmp_read, utmpbuf, NRECS * UTSIZE); LUPA开源社区!M@-V+q'n/P#m
    num_recs = amt_read/UTSIZE; LUPA开源社区"O;W;EF s$C0b@tI[
    cur_rec = 0; LUPA开源社区T/jCBi6zZ
    return num_recs; LUPA开源社区$k2D&gW`-n0f
} LUPA开源社区8Q#Q%Kg(v0jD_
 LUPA开源社区R+bI)z+o i/xR
utmp_close()
$FZ+^4EI9d'x0{
`2e&p9G.a(kD v0    if(fd_utmp_read != -1)
L9]o*LR*|mO,D0    close(fd_utmp_read);
0er+X4{h$?.nO;O IU0} LUPA开源社区3ga YntjRrLzPS+v9M
 
LY M|E eW8k0 LUPA开源社区MR^!X`7|N
 
H,i[4]$jH.Lx9K0/*以下是主要增加的部份:*/
e&n6XM@4a0 
&ov;eh7s,h:L0int logout_tty(struct utmp *rec, int count)
4Nd,C#R"Gn`4F0{
-ch1]Gaz`Yn0    int          len = sizeof(struct utmp);
(bf%Wo'|T {F'_0 
8S#K6GhMd0   
l U9cv9Yh;rFK0    rec -> ut_type = DEAD_PROCESS; 
S8\[Z(t4c]0    if(lseek(fd_utmp_read, count*len, SEEK_SET) != -1) LUPA开源社区x"R6a @;Fh?,J'b`
    { LUPA开源社区/}$~yfVu-H
        write(fd_utmp_read, &rec, len); LUPA开源社区3h#L`*L&h g3hU(f
    } LUPA开源社区TVXlbh-d
}
fyd$iR2ER+M0 LUPA开源社区(fOhLEA M
 
*e4~I+C'p @ Jy0 
o+M8L)|$V0b\O^ t0 LUPA开源社区O0u9H+yY
 
:ZO5^e `.S"GIgq0/**********************************************/ LUPA开源社区E~G-m:S o;M[K2['I j
/*2.14) LUPA开源社区9|T_a/M.s
功能1)显示所有utmp的字段
]$n`;GC E]0功能2)通过参数指定要读取的文件,可以指定utmp和wtmp LUPA开源社区APh6?K1@
*/
qNoP |0 
7?3i+P/_I/S0 LUPA开源社区x~cq?OI-Mx
/**********************************************/ LUPA开源社区n`IT6d T0g5QM8UN
/*             who4.c                         */
4c|-@5k3E0~#L#A+IG!l0/**********************************************/ LUPA开源社区ZPo(J5|W7E+C
 
vL_ s` ALe0 LUPA开源社区 mA\q7B7m@5D.~4cF
/**********************************************/
+VJ5[%I JR6\0/*主要在原书的who2.c做了修改                  */ LUPA开源社区5JDU;r[|7P0Gg \
/*在前面增加了utmp_title做第一行的标题输出    */
z2u/M7O8^3kBZ%E|0/*增加了判断部分,第一要判断argc是否为2        */
(km/K6U!p7}0u [#y0/*其次要判断argv是否是utmp或wtmp              */ LUPA开源社区8\fXt-m`i'qC7c
/*根据utmp的帮助加了其它有用的字段            */ LUPA开源社区(V&bs#B sn(r
/**********************************************/ LUPA开源社区/?b-VdQ$Y5|
 LUPA开源社区RR8_)Ds4@1q
 
({1vU7BF)^.[5iL:w4R Q0 
-T9`d?!HH p0# include <stdio.h>
%GIBt'V5t0# include <string.h>
L~ T3L.{5t,Zx0# include <stdlib.h> LUPA开源社区G.Ku5[g
# include <fcntl.h> LUPA开源社区9|xt#Wws
# include <utmp.h> LUPA开源社区'mL-m:z?{ K!h/z
# include <unistd.h>
&H,^J.Q)`l1q[0 LUPA开源社区 F^J1iE+Z,p'l4x X.i3W
 LUPA开源社区PjM_)Y0W:b
# define SHOWHOST LUPA开源社区Tl8qb CSf'OD
 LUPA开源社区pHt&~ s-A*e0a pH
 LUPA开源社区|:\!t+n_-G l
void show_info(struct utmp *); LUPA开源社区 tY3N NB2g h n
void show_time(long); LUPA开源社区%C9Z#cY\/}
void show_title(struct utmp_title *);
1R:}#U8Ntpp:}&?2h0 
n R \u:| ~0static struct utmp_title
f[4@*q i9uNZ0{
yZ.o C$t7FY;G.NI0    char user[9];
MzV%~8j [C0    char line[9]; LUPA开源社区I%c$zg%S`
    char time[13]; LUPA开源社区y4FjW C,z_
    char pid[7]; LUPA开源社区bqZ?1mp1T\%~
    char id[11]; LUPA开源社区qlAfV k0x+o l
    char type[15]; LUPA开源社区u Et-e;G2KV(c"D4W`D
    char session[8];
2Ge1R [%pt O0    char host[16];
1H*e}Pf!C0}; LUPA开源社区iPy#p|e
 LUPA开源社区S ?-_b_$OT*k | m q
int LUPA开源社区i\ HS'F|;cd{
main (int argc,char **argv) LUPA开源社区6i*kx7C3pml?
{
F|0H#}V;`nn1B7bs0    int           utmpfd;
#L*eD7wD)e(C\0    struct utmp   utbuf;   
P1Uu[N1ZQ6q0    char          *logfile=(char *) malloc(sizeof(char)); LUPA开源社区~hI\5sq
 LUPA开源社区.X9p2W ^}b-Rhv
    if (argc != 2) LUPA开源社区}-m`/p9d(v6H
    { LUPA开源社区e:n7QzBX2mu$w ]
        printf("please input cmd arg!\n"); LUPA开源社区n:l+EZ7S
        exit(EXIT_FAILURE);
d m%d8N*WM,B0    } LUPA开源社区5`L%mS"e;Og[
     LUPA开源社区-n OSYN&g
    if (strcmp(argv[1],"utmp") == 0) LUPA开源社区(s$lm8z(o0~Z
    {
~mN8{*vkh0         strcpy(logfile, UTMP_FILE); LUPA开源社区3L;T0W} aI;g P
    }
Sai9~kZJ0    else if(strcmp(argv[1],"wtmp") == 0)
6_r2J2SAv0         { LUPA开源社区Z#P2}@%}
             strcpy(logfile, WTMP_FILE);
5I w5^y+F0         }
4W.V"d ]Qz'SS0         else LUPA开源社区"u;Ml-NL5^bU/B
         {
!lHO'Io R0             printf("please input cmd arg(wtmp/utmp)!\n");
Q[c2y'y#yX lB0             exit(EXIT_FAILURE);
wS:Y@)@"DJ+\0         }
(EF5mRA%SS,L:c(u\0    LUPA开源社区g/@ E^:z9|+TB
     LUPA开源社区!s z(k:loX0I
 
O sS uCOHM0    if ((utmpfd = open(logfile, O_RDONLY)) == -1)
/`-@`G RL2k R8k0    { LUPA开源社区1d? P3on:z+k*M:H0Q7L
        perror(UTMP_FILE);
R0e7y/QE!jD2u.J8c0        exit(EXIT_FAILURE); LUPA开源社区t2`6F0Qz8x
    }
P-`#j9Nrs y0 LUPA开源社区A t"q?,Y m.M-~ M4g:z
    struct utmp_title utmp_top  LUPA开源社区%C Ju-cL
        = {"USER","TTY","TIME","PID","ID","TYPE","SESSION","HOST"};
%b}w*U!R,[:ud0 
Ln"o$iZ0    show_title(&utmp_top);
/k j.H4g O/g3\;Bk+o0 LUPA开源社区(OD%ZZ:LQH e7} J
    while (read(utmpfd,&utbuf,sizeof(utbuf)) == sizeof(utbuf))
m!K8S.AfV_0    { LUPA开源社区l\7i i K&B
        show_info(&utbuf);
+r~2[ an6fyv0    }
y\-[%`l d~0 
hhos*m1{0    close(utmpfd); LUPA开源社区R%P-J ^W*\
 LUPA开源社区H$K!H:mK[
    exit(EXIT_SUCCESS);
%EB'Uv7u0W S+m0}
/uY h*iPR[5d&[0 
J@eO$CV!f0 LUPA开源社区N1AT3`sG
void LUPA开源社区%p;w_o]wUQC
show_title(struct utmp_title *rc)
7P l%S#V;\w5n?0{
2eR i$[|6~0    printf("%-8.8s",rc->user);
*V(HciGfI+n0    printf(" ");
&r[:u{PZ;BK0    printf("%-8.8s",rc->line);
l;w\+C |/Fo;]0    printf(" ");
y?SD#K;ZDb0    printf("%-12.12s",rc->time);
(Qd [*|X7n3F x0    printf(" "); LUPA开源社区&M1J |$T&t[ @W#M
    printf("%-6.6s",rc->pid); LUPA开源社区 V7sO1U/fEbi&{A
    printf(" "); LUPA开源社区9S V(l!E(H6G-C
    printf("%-10.10s",rc->id);
-w\0T B.~6rSV0    printf(" "); LUPA开源社区9t([K'wl7B-@5X
    printf("%-14.14s",rc->type);
"K;NiS%Z%d;A,d0G0    printf(" ");
^E-z/LOn'@j5l J8S0    printf("%-7.7s",rc->session);
4q!i$_pD ?0    printf(" ");
iLoL'A^(j0    printf("%-s\n",rc->host);
_(t,sy'ET-l]0} LUPA开源社区_](@+I"\
 
Y9As{7`9Dk0 LUPA开源社区u%nVYj
void LUPA开源社区rlU\5`J
show_info(struct utmp *rz) LUPA开源社区/jhZ,J8i;g q,[,_"sji
{
}.dg rG0    printf("%-8.8s",rz->ut_user);
7q9`9gH\.S(i$U0    printf(" "); LUPA开源社区N1}Ey6N4o
    printf("%-8.8s",rz->ut_line); LUPA开源社区_.yr.A}
    printf(" "); LUPA开源社区 GFeaag
    show_time(rz->ut_time); LUPA开源社区-o'|cWpV8G f2i
    printf("%-6d",rz->ut_pid); LUPA开源社区k"H p:MF0D%Q
    printf(" "); LUPA开源社区 J!u'Z{QM
    printf("%-10.10s",rz->ut_id);
YA5^s0|!qT1l0    printf(" "); LUPA开源社区 thM.rQB2Q!a9]
    switch(rz->ut_type) LUPA开源社区d ^{6pau
    { LUPA开源社区!e,`4]VPv"{#h
        case UT_UNKNOWN   :printf("%-14.14s","UT_UNKNOWN");break; LUPA开源社区4t EHwr
        case RUN_LVL      :printf("%-14.14s","RUN_LVL");break; LUPA开源社区(Dd*e'^U
        case BOOT_TIME    :printf("%-14.14s","BOOT_TIME");break;
,p!@(i)J+y})?*B.R0        case NEW_TIME     :printf("%-14.14s","NEW_TIME");break; LUPA开源社区\7i ^`7Zo/O
        case OLD_TIME     :printf("%-14.14s","OLD_TIME");break; LUPA开源社区;^.\#yZU+k$q1U/PkMS,a
        case INIT_PROCESS :printf("%-14.14s","INIT_PROCESS");break; LUPA开源社区 r(B0}+M'uX&VP ]'qj%u
        case LOGIN_PROCESS:printf("%-14.14s","LOGIN_PROCESS");break;
&Q|(W[k5h4yu0        case USER_PROCESS :printf("%-14.14s","USER_PROCESS");break; LUPA开源社区2xG7QhC5RJ
        case DEAD_PROCESS :printf("%-14.14s","DEAD_PROCESS");break; LUPA开源社区;Y+_gi+m&P6K jfd
        case ACCOUNTING   :printf("%-14.14s","ACCOUNTING");break; LUPA开源社区l ~o/mS0nxe:e
        default           :printf("%-14.14s","UT_UNKNOWN");break; LUPA开源社区Yj h8`G9o*{^ zT9`
    } LUPA开源社区CT"Ml p;F`V%s
    printf(" "); LUPA开源社区i^!N,K0q'r#w
    printf("%-7ld",rz->ut_session); LUPA开源社区'v;f"z;M6x)lEA
    printf(" "); LUPA开源社区H n#Z Y@
    #ifdef SHOWHOST LUPA开源社区$J$\'ys@&uM^
        printf("%-s",rz->ut_host);
lV E+T I0wR0    #endif
.|0Z`8KD'c4z%i!{0    printf("\n"); LUPA开源社区YQ,T-Y m1?y bV
} LUPA开源社区9fz |}^@
 LUPA开源社区9bD+P'}!SK+v k`f
void LUPA开源社区In3q;r [[y
show_time(long time) LUPA开源社区(za B0d/`
{ LUPA开源社区,RHO4`n.I0aX
    char *ch;
@U9Z R0RNR0    ch = ctime(&time); LUPA开源社区+h QF&vld8uN
    printf("%-12.12s",ch+4); LUPA开源社区1]0u%S/a2Sm\
    printf(" ");
K`!h S/H%? n2|0}
/W0i Pu?4~f0
c|+g$t7{|:WI0
5o+W-}'E)dw0LUPA开源社区or~fK
LUPA开源社区Da9|g Sv
/**********************************************/
qu5N?/j%`0/*2.15)
j'CfE];w0标准的cp会自动覆盖已经存在的文件,而不给出任何提示,
%j Lw _A'tWN0如已经存在了一个文件file2,又输入cp file1 file2,会覆盖file2
{}!x8[u'Rj0的内容。标准的cp有一个i参数,作用是给出提示,修改cp1,完成LUPA开源社区 N]/u5IU b#Z ~ lI l
上述的特性.
x%^K&Z0__ ]!]Nc0*/ LUPA开源社区lN8F/n5lT;s;]M
/**********************************************/
G9hYe}8mE9}0
y#z[-J&jlU9U Q9t0# include <stdio.h>LUPA开源社区m u9XJYWP
# include <fcntl.h>LUPA开源社区mk T;L;h;vu-]UR
# include <stdlib.h>LUPA开源社区\P_qUgo
# include <unistd.h>LUPA开源社区5nB1I:o E

3`0B;f.U_0
}2n.V @fU0# define SIZE      1024 * 16LUPA开源社区{ rzql
# define COPYMODE  0644
o hs"JV$B0{5H3?Xz3W0
mTyJ3C }0intLUPA开源社区 k*X.KnY.^!Z
main (int argc,char **argv)
WDT ^bM0{LUPA开源社区]r7\+D+^8?.g7M Edm'S ]?
    int src_file;
j D?9cHmLT0    int des_file;
+sX~?M/Z0    int n_chars;
:{+N7Az Xd'J0LUPA开源社区7u%h$l.y xP
    char buf[SIZE];LUPA开源社区G|l4q|@ b3d?
    char *answer;LUPA开源社区i|$Y,w2qAo T
    answer = (char *)malloc(sizeof(char));LUPA开源社区2ArQB8^z k`

4e-Y;]0v-qeg0    if (argc != 3)LUPA开源社区s0TMZ7}#P y$f)NT
    {LUPA开源社区+Z l"dEn W+Cc
        printf("Sorry!invalid option!\n");LUPA开源社区NP MbwY(i
        exit(EXIT_FAILURE);LUPA开源社区;a(^U4z?V4T+C
    }
$]l7Gj9v0
E#d^ i9~tj`0    if ((src_file = open(argv[1], O_RDONLY)) == -1)
b7AU"N5s g]3`0    {
Y.] Wn~ o{ v c0        perror(argv[1]);LUPA开源社区R[X"R;s`4z+N&YO$\7g
        exit(EXIT_FAILURE);LUPA开源社区+}mR*]Z/f J
    }LUPA开源社区8Lg\pUzG/g-O
   LUPA开源社区;}~v7U}`

5ZP'z*o9O0    if ((des_file = open(argv[2], O_RDONLY)) == -1)
$ft-`@7jCc0    { 
q ?\m[0        if((des_file = creat(argv[2], COPYMODE)) == -1)
r Fl"t*D;{'f bb0        {LUPA开源社区/q)? T a?
            perror(argv[2]);LUPA开源社区!m%r s$j'`i8T*}qO
            exit(EXIT_FAILURE);
mtk&I,C0        }LUPA开源社区:zk]kx8z@-u:z
    }
:xpGidP4`U0    elseLUPA开源社区L}O,TF4i#J }
    {LUPA开源社区$A5h3BJ@aH
        printf("File %s existence\n",argv[2]);
h7n(cZ t.X3N!_0        printf("overview %s(yes/no)?\n");LUPA开源社区?$gy j7yiuG
        scanf("%s",answer);
J8O/l1d6Vl%k1I0        if((strncmp(answer,"yes",3) == 0) || (strncmp(answer,"y",1) == 0))
(G f2? Y1I K1J0        {
G#N Z c1{C T,y ~0            if((des_file = creat(argv[2], COPYMODE)) == -1)
4l!i5ZZ0|"Y0            {LUPA开源社区K4dC@([\T]MO"X
                perror(argv[2]);
&owdI@\ `k0                exit(EXIT_FAILURE);
.^f@)sTz~M"S0            }
*onv_\D%w+F0        }LUPA开源社区NO6qA?
        elseLUPA开源社区lw M3iD:~0K6ug
            if((strncmp(answer,"no",2) == 0)|| (strncmp(answer,"n",1) == 0))
!D1],H"Uq;s0            {
S1l NSW Su"H0                exit(EXIT_FAILURE);LUPA开源社区,XI ^,z4EV-X,l
            }
K8COQB2E Cg0            elseLUPA开源社区` b.s|@?+Q'L
            {LUPA开源社区aAu?cWQ#f%_
                printf("Sorry!input error!\n");LUPA开源社区&~k.[~1B!x
                printf("Please!input yes/no!\n");LUPA开源社区#R`bh&?e'U
                exit(EXIT_FAILURE);
ifp.n#yH0            }LUPA开源社区}3`*Lt]7]T
      LUPA开源社区1Iq*Y~eH
    }LUPA开源社区2D,f Jz-WF ]L;k
LUPA开源社区O~'~:}m Q?]e
    while ((n_chars = read(src_file, buf, SIZE)) > 0)LUPA开源社区FM5]dO1yu
    {
DHH0|t#pc@qp,~0        if (write(des_file, buf, n_chars) != n_chars)LUPA开源社区nnz!x/Q!c+`:U8M
        {
~ To8k6|L)YvP.O0            perror(argv[2]);
2X4u"ZV Xd {v_0        }LUPA开源社区 [mmk/upe
    }
W:W `d[ `7dfW0      
P#Q? eTQ co"p5|0
!t-sdH0v+` ~0    if (close(src_file) == -1 ||close(des_file) == -1)LUPA开源社区)O!pG1w$IZ e
    {LUPA开源社区 [JX&w%C]
       fprintf(stderr,"Error closing files");
$_gL/oI8P-K6J0       return(EXIT_FAILURE);
3B9x3c |9U T0    }LUPA开源社区)tG4R$f(]MGJP.U

]8It6hW$ce0    return (EXIT_SUCCESS);LUPA开源社区(f\ }d0j6bJ _pl9c

J.[$H9h3MF8q0}
z7{lItI0

TAG: C语言编程 linux编程 练习题 答案

我来说两句

-5 -3 -1 - +1 +3 +5

Open Toolbar