我是大帅哥,擅长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&hbz`-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
VU P'{P0IV0
iqQW+]%H-sY ~v0 LUPA开源社区 L!e`S+I#S#mPd
# define SHOWHOST
G;{xen9W%j0 LUPA开源社区%o8Y,u wl5F gR
void showtime(long); LUPA开源社区}A1Z Z k
void show_info(struct utmp *);
8xH#Ab;T3P|1b"v(@0
nnS.G'ke0b\0
2Ph"w Xu[A0 LUPA开源社区 _&hU,f.v6V)Iz
void show_info(struct utmp *utbufp) LUPA开源社区WS LY O v6y
{
+x[kb6J0 if (utbufp -> ut_type != USER_PROCESS)
F2r'MN,Q0 {
g^Di7U;~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,? {g h&I0 printf(" ");
U vq6N(s??7osi0 showtime(utbufp -> ut_time);
B1Fud7Lt8doq+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
:Y0wFt"pakE0 printf("\n"); LUPA开源社区n6L1NYv1@C*shv
LUPA开源社区Y,mBW qq @W1t
}
9W#cY8W2trm&M;q+g0
C1EC/v){(n:oP0 LUPA开源社区Ny7`6o3D!]
void showtime(long timeval)
G/eJB?o0{
1{JZG|\`0 char *cp; LUPA开源社区 {-x GN B&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
]UY8mzn0int main()
eJYV H [0{ LUPA开源社区"c vPfl1`U!f M
struct utmp utbuf; LUPA开源社区.q4Y9b7s e
int utmpfd;
Y/a'VD%z|[]V0 LUPA开源社区SJ_Rm/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"|4Hpi
}
(y!xi ]q7J)RYA"i'N0 LUPA开源社区x&u!{p@8B Li
while (read(utmpfd, &utbuf, sizeof(utbuf)) == sizeof(utbuf)) LUPA开源社区Da$ct.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
/******************************************************/
R5v j1x_~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>
,_MvLY&~2t|0# include <time.h> LUPA开源社区 ]iy/Y%v,A-b8{
# include <stdlib.h> LUPA开源社区FPM(f&{i R NK
LUPA开源社区Hh%E2ub%h!f:nqQj
,{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开源社区D9gIRsF
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 J7xf0}
+r3` \`8}p I0\_0/********************************/
[ bfYn0 LUPA开源社区%Jih-zb
,T!G(O:}!`l1Zp']Z1` z0int main() LUPA开源社区;E@*HNZ4h!i
{
~G0AL+nlCq6T0 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`1Ex*xW9Y:X
perror(UTMP_FILE); LUPA开源社区;Smx?2@QCr
exit(EXIT_FAILURE); LUPA开源社区?]#W*{,X z0KB2w
} LUPA开源社区q5`&{rtU6In_
LUPA开源社区B9zi)u/b
while (read(utmpfd, &utbuf, sizeof(utbuf)) == sizeof(utbuf)) LUPA开源社区dV0wn7m1GL/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);
?EAeedSE0}
\7G opP,|ra*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-xE9DqjN;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(~"Fd3xeFS0# include <string.h> LUPA开源社区`:imO&I/T`o6OE7T:^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(JD f0c0
8Cy SVphb0void oops(char *, char *); LUPA开源社区xK8jzz~[7?M
X7J6Na!d$O?o0int LUPA开源社区%N'BVM?ww!`
main(int ac, char *av[]) LUPA开源社区%t:_S MQ1O%}7Af
{
LUPA开源社区 Ud1c9KD
答案: LUPA开源社区c v'WN0MhT
;F&hbz`-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
VU P'{P0IV0
iqQW+]%H-sY ~v0 LUPA开源社区 L!e`S+I#S#mPd
# define SHOWHOST
G;{xen9W%j0 LUPA开源社区%o8Y,u wl5F gR
void showtime(long); LUPA开源社区}A1Z Z k
void show_info(struct utmp *);
8xH#Ab;T3P|1b"v(@0
nnS.G'ke0b\0
2Ph"w Xu[A0 LUPA开源社区 _&hU,f.v6V)Iz
void show_info(struct utmp *utbufp) LUPA开源社区WS LY O v6y
{
+x[kb6J0 if (utbufp -> ut_type != USER_PROCESS)
F2r'MN,Q0 {
g^Di7U;~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,? {g h&I0 printf(" ");
U vq6N(s??7osi0 showtime(utbufp -> ut_time);
B1Fud7Lt8doq+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
:Y0wFt"pakE0 printf("\n"); LUPA开源社区n6L1NYv1@C*shv
LUPA开源社区Y,mBW qq @W1t
}
9W#cY8W2trm&M;q+g0
C1EC/v){(n:oP0 LUPA开源社区Ny7`6o3D!]
void showtime(long timeval)
G/eJB?o0{
1{JZG|\`0 char *cp; LUPA开源社区 {-x GN B&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
]UY8mzn0int main()
eJYV H [0{ LUPA开源社区"c vPfl1`U!f M
struct utmp utbuf; LUPA开源社区.q4Y9b7s e
int utmpfd;
Y/a'VD%z|[]V0 LUPA开源社区SJ_Rm/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"|4Hpi
}
(y!xi ]q7J)RYA"i'N0 LUPA开源社区x&u!{p@8B Li
while (read(utmpfd, &utbuf, sizeof(utbuf)) == sizeof(utbuf)) LUPA开源社区Da$ct.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
/******************************************************/
R5v j1x_~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>
,_MvLY&~2t|0# include <time.h> LUPA开源社区 ]iy/Y%v,A-b8{
# include <stdlib.h> LUPA开源社区FPM(f&{i R NK
LUPA开源社区Hh%E2ub%h!f:nqQj
,{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开源社区D9gIRsF
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 J7xf0}
+r3` \`8}p I0\_0/********************************/
[ bfYn0 LUPA开源社区%Jih-zb
,T!G(O:}!`l1Zp']Z1` z0int main() LUPA开源社区;E@*HNZ4h!i
{
~G0AL+nlCq6T0 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`1Ex*xW9Y:X
perror(UTMP_FILE); LUPA开源社区;Smx?2@QCr
exit(EXIT_FAILURE); LUPA开源社区?]#W*{,X z0KB2w
} LUPA开源社区q5`&{rtU6In_
LUPA开源社区B9zi)u/b
while (read(utmpfd, &utbuf, sizeof(utbuf)) == sizeof(utbuf)) LUPA开源社区dV0wn7m1GL/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);
?EAeedSE0}
\7G opP,|ra*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-xE9DqjN;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(~"Fd3xeFS0# include <string.h> LUPA开源社区`:imO&I/T`o6OE7T:^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(JD f0c0
8Cy SVphb0void oops(char *, char *); LUPA开源社区xK8jzz~[7?M
X7J6Na!d$O?o0int LUPA开源社区%N'BVM?ww!`
main(int ac, char *av[]) LUPA开源社区%t:_S MQ1O%}7Af
{
