a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 82|回复: 0

[综合辅导] Linux认证:配置Linux代理服务器Squid

[复制链接]
发表于 2012-8-4 12:07:07 | 显示全部楼层 |阅读模式
Linux认证:配置Linux代理服务器Squid* y! s0 h& n: _4 _$ T
配置Linux代理服务器Squid/ l1 t2 [* h0 h9 ], E/ G
一)概述
2 b2 [5 b& X; Q# `4 ?  y8 b.open系统调用返回的文件描述符是非负整型。" f8 K' V. T) c8 F7 s
。每一个进程都有自己的文件描述符集合。( ~: E, ~  b. P6 i  W) j2 _/ U" l# P
。当创建进程时,通常有3个打开文件描述符(0,1,2),0代表标准输入,1代表标准输出,2代表标准错误,它们统称为标准IO./ z* J+ F) L6 ^9 _! G/ |, ^* J
。当多个描述符指向同一个文件,每个文件描述符仍保持他独特的性能。4 O) ~1 h" j: F  i2 e$ D
。由于文件描述符在一个进程中是特有的,因此不能在多个进程中间实现共享,而唯一的例外是在父/子进程之间,当一个进程调用fork时,调用fork时打开的所有文件在子进程和父进程中仍然是打开的,而且子进程写入文件描述符会影响到父进程的同一文件描述符,反之亦然。+ \% n/ d6 y! r
二)父/子进程对文件描述符的分支使用示例7 |: ]' D$ v; ^$ n
源程序如下:2 w) O$ V' c, S/ ?
#include 《stdio.h》9 c7 ]' N" D. ?8 P* O7 g2 f
#include 《string.h》: b( r. [$ J- f
#include 《stdlib.h》
/ R$ a: O" z+ m( F7 t#include 《assert.h》
: W. T9 R/ W: u- }9 E#include 《unistd.h》
$ b: k2 N1 Q- U* X) R' Q#include 《sys/file.h》
. u) w7 d  X5 N  u: I#include 《sys/times.h》
4 o( g  D0 l( m% h! A#include 《sys/stat.h》
; G; |- F. N4 t& i#include 《sys/wait.h》. q% A# N& L+ Z( ?
void writestr(int fd, char *buf)1 `' c8 X4 y3 `5 M+ ?
{1 e! N. t# ^& I; N: A
int r = write(fd, buf, strlen(buf));
# B& i, |/ C3 ^if (r == -1)* }5 B8 I$ Q4 ]$ P. \& s% G
perror(buf);
' R/ o* o* d2 \* v}( \1 J, L9 u6 R& O  p
void busywait(void)
! A  O6 V4 D# P, K* [/ W" n- Z& H{0 T. g. e6 B, Q3 m3 l5 `- h
clock_t t1 = times(NULL);
& g6 e; g1 m. f$ m" Ewhile (times(NULL) - t1 《 2);
' A  A5 Z8 B% U}
! D2 z% g& {7 Nint main (int argc, char *argv[])
. Y$ K" k6 Z0 o8 A1 r{
1 i0 o8 d& V3 F4 F0 Xint fd = open(“thefile.txt”,
& g! M8 a( g  Y2 K: ZO_CREAT | O_TRUNC | O_RDWR,, p9 h9 i' j, _3 o( v+ n* ?
S_IRWXU | S_IRWXG | S_IRWXO);+ f. L- w% \* K: u9 m* D
assert(fd != -1);
, ~* n5 }+ a2 T1 L9 a2 u" lwritestr(fd, “This is the parent.\n”);- C7 C: Q5 o; u. s  C. w
pid_t pid = fork();
% J6 o' X% [/ n# Q8 obusywait();. I6 k4 J: X0 ~& m6 s
if(pid == 0){
; [5 Y. N- F' N* u. m* B2 Swritestr(fd,“Child write\n”);& h# d$ f3 b9 D  m1 [: J0 v% ?- Y
}% W( `1 M, p& ^  ~
else{
$ B! N$ g+ {3 D, J9 u" ~% lwritestr(fd, “Hi it‘s me. Im back.\n”);
( i+ T4 o3 h  h6 Q, L/ O5 dint status;2 s$ @& s% U, B) |# {$ @
waitpid(pid, &status, 0);. [% l# A/ q9 y; p
}
; `5 H, H9 T3 h2 Tclose(fd);) d6 o% |3 ~* u! B3 w5 W
return 0;/ ]3 _4 E) L  \/ v* f5 I! }
}- V! Q3 E1 ?" `: V! L7 @
6 S% Q, y4 v* d* P, |
编译fork-file.c( `2 |$ R) v; I
gcc fork-file.c -o fork-file( b* R! R4 l8 E5 g9 o2 Y* `. h  P
执行fork-file,同时查看thefile.txt,如下:
' c' X+ z( U5 M& b。/fork-file && cat thefile.txt
) s* w5 x: u* g% T2 M" nThis is the parent.
# g5 w% e! p; m1 l( ]  _! \, i0 F6 vChild write, }! K* V! P* I! x
Hi it’s me. Im back.2 @- _. ^& l$ r+ @) `
。/fork-file && cat thefile.txt
) N8 h! q( B/ W3 g- [; ^" n! q$ t( I3 xThis is the parent.0 L, f$ T1 p$ @. M9 J) D
Hi it‘s me. Im back.* Y' ]5 t5 U1 N: A" y
Child write
  c# f# Y& E- ?3 [' E注:( b* C! c9 b$ N2 m% ^
1)我们发现每次运行结果的顺序都不相同,有时父进程会先调用write系统调用,有时子进程会先调用write.$ I$ o2 U1 }: r
2)子进程继承了父进程的文件描述符,如本例子open系统调用得到的文件描述符是3,在子进程和父进程中的文件描述符都是3." ?4 V6 U5 V7 x9 ]
三)文件描述符与/proc
9 G' q( X# k4 H# r" v子目录/proc/self本身就是当前运行进程ID的符号链接。
' |1 ^# P5 H; C! O$ S+ P用ls -ld查看/proc/self目录的符号链接,发现每次都不一样,说明我们每次用ls命令时的进程ID都是不同的。
" Z. Q& z2 t: O) p3 Sls -ld /proc/self; l% k) d' d6 ^. V0 H) ?! v
lrwxrwxrwx 1 root root 64 2010-10-10 06:25 /proc/self -》 30525; G: G* x4 Y* D: u& u3 s
我们查看/proc/self/fd目录下的文件描述符,如下:
7 _) {. e+ B/ Z# |ls -l /proc/self/fd- A. [5 F+ B' W0 c+ [& {
total 0. K* ^9 F& P" ~7 Q$ F+ L
lrwx------ 1 root root 64 2010-10-10 12:16 0 -》 /dev/pts/1
8 O$ {5 g  p6 v- v- wlrwx------ 1 root root 64 2010-10-10 12:16 1 -》 /dev/pts/1
5 S6 \# i& P( X2 s3 O/ V7 xlrwx------ 1 root root 64 2010-10-10 12:16 2 -》 /dev/pts/1: h' x5 U+ Z8 q# l, ^7 o
lr-x------ 1 root root 64 2010-10-10 12:16 3 -》 /proc/30578/fd
" K& Q- P! Q# p: M# X  L我们看到了3个标准的IO描述符,它们都被软锭接到了/dev/pts/1,/dev/pts/1是我们通过ssh打开第2个终端,如果是第1个终端,那将是/dev/pts/0.+ M; I- B6 t7 ~) U5 ^( X/ `0 E
如果我们通过ipmi的串口登录,这里应该是/dev/ttySx,而如果是本地登录那应该是/dev/ttyx,如果是单用户登录那将是/dev/console.
9 {$ {) v0 H. N1 H& b2 }/dev/pts/x是虚拟终端
# D2 u7 F4 b, W$ O0 x' M& V/dev/ttySx是串行控制端
9 j0 b+ s% `- j' s8 _& b( Q/dev/ttyx是控制台5 u: ~7 J/ o1 f
/dev/console是单用户控制台+ ^- D3 i% j- Y" H! m6 g- ^4 O
文件描述符3,这个描述符是ls进程打开/proc/self/fd(也就是/proc/30578/fd)所得到的文件描述符。2 y8 |* e/ }0 @6 h; w9 d3 K" q- _
同样我们将ls -l /proc/self/fd的信息输出的一个文件中,如下:
( E1 g6 Y+ w# N9 e# Rls -l /proc/self/fd 》 /tmp/foo.txt && cat /tmp/foo.txt
5 c6 y0 k7 U4 r9 }- atotal 0
& x9 \% c2 [2 m# o  V6 u' S6 vlrwx------ 1 root root 64 2010-10-10 12:22 0 -》 /dev/pts/1) ~, G+ l1 O- p. U) i8 G# F
l-wx------ 1 root root 64 2010-10-10 12:22 1 -》 /tmp/foo.txt
6 Z$ k; I# G, a( e3 m+ N  t/ H( Flrwx------ 1 root root 64 2010-10-10 12:22 2 -》 /dev/pts/1
7 {5 E4 p! M+ }) q( p& ~lr-x------ 1 root root 64 2010-10-10 12:22 3 -》 /proc/31005/fd
* P, v0 X7 }# r7 w" l这时标准输出的文件描述符不再是/dev/pts/1了,而是/tmp/foo.txt' W1 }% c* V+ }. _8 C( j. n
再如我们将/dev/null做为标准输入,如下所示:/ C$ J8 j' g4 i( P
ls -l /proc/self/fd 》 /tmp/foo.txt 《 /dev/null && cat /tmp/foo.txt
( r8 M0 s7 U  M' E9 K% z3 I. }total 0
* A; O# E, q$ o  v0 [. {lr-x------ 1 root root 64 2010-10-10 12:30 0 -》 /dev/null
7 O# w7 s: U/ U% U3 u% }l-wx------ 1 root root 64 2010-10-10 12:30 1 -》 /tmp/foo.txt
7 |, k8 X1 q+ H9 y1 Mlrwx------ 1 root root 64 2010-10-10 12:30 2 -》 /dev/pts/1
, r8 E2 ?) B8 |lr-x------ 1 root root 64 2010-10-10 12:30 3 -》 /proc/31998/fd9 p. M3 x- o5 [7 T5 a
此时标准输入的文件描述符也不再是/dev/pts/1了,而是/dev/null
4 h9 u5 q. a/ _最后我们将/dev/null做为标准错误输出,如下所示:: ]) d- h; X. m2 V0 n
ls -l /proc/self/fd 》 /tmp/foo.txt 2《 /dev/null && cat /tmp/foo.txt
+ w# m7 u, }, _7 ztotal 0# G0 h3 C/ u  E" o% K4 D# [$ u
lrwx------ 1 root root 64 2010-10-10 12:37 0 -》 /dev/pts/1
4 h+ n6 Q+ C9 I1 Ql-wx------ 1 root root 64 2010-10-10 12:37 1 -》 /tmp/foo.txt, i. o& t$ c" n; `& l: H2 |8 M( l
lr-x------ 1 root root 64 2010-10-10 12:37 2 -》 /dev/null
/ F: S! d. l, j  N' N0 B1 S5 Plr-x------ 1 root root 64 2010-10-10 12:37 3 -》 /proc/32435/fd: u6 N5 M" \" t" b  N7 j" ~
此时标准错误输出的文件描述符也不再是/dev/pts/1了,而是/dev/null
  Y8 I, N: }5 L8 A) C四)文件描述符与lsof命令
4 f: A' m% k1 e5 h$ e& d7 s( M- m用lsof命令可以查看系统中所有进程的所有打开文件,前提是你有相应的权限。9 B/ R7 w3 Z# q9 v7 ?6 P/ d
我们首先查看当前bash的PID
: `% Y+ R8 i! fecho $$* i; k1 `1 X4 f! Y, ~4 ^
3174
* K( v# l# T) Q用lsof查看打开的文件。* a! t9 w* T4 f& i/ g( g
lsof -p 31747 u, T  z, V0 |8 W
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
2 U0 j# _/ y! S+ [. i  a1 _bash 3174 root cwd DIR 8,1 4096 32577 /root
$ a2 s; {* {) f, f" Jbash 3174 root rtd DIR 8,1 4096 2 /
& M5 H: W, I5 F! X2 Hbash 3174 root txt REG 8,1 797784 309511 /bin/bash# ~' t1 f" U' W6 M) R, \
bash 3174 root mem REG 8,1 47520 147727 /lib/libnss_files-2.7.so
6 @; A% m& V) dbash 3174 root mem REG 8,1 43472 147716 /lib/libnss_nis-2.7.so
# f5 P, d# c; Jbash 3174 root mem REG 8,1 88968 147720 /lib/libnsl-2.7.so9 r, G* Y. [7 H: H6 o/ k% I& W/ O( J
bash 3174 root mem REG 8,1 31536 147722 /lib/libnss_compat-2.7.so$ c$ b( _- W2 D( U& i+ a
bash 3174 root mem REG 8,1 4636768 782032 /usr/lib/locale/locale-archive
0 n, ^- B1 I% m2 `( bbash 3174 root mem REG 8,1 1375536 147730 /lib/libc-2.7.so* |) ?4 T' T# R2 w$ i9 M2 Z) m; o: Z
bash 3174 root mem REG 8,1 14616 147734 /lib/libdl-2.7.so& m/ s4 N% f) r: m4 o$ D6 |8 U; \0 k
bash 3174 root mem REG 8,1 256288 147710 /lib/libncurses.so.5.7
, q; L8 m; W; k! v- t5 z- Zbash 3174 root mem REG 8,1 119288 147733 /lib/ld-2.7.so5 e* P/ _% f, V; W; [$ L! i4 ]
bash 3174 root mem REG 8,1 25700 767172 /usr/lib/gconv/gconv-modules.cache
, u+ W, U; `. {( Qbash 3174 root 0u CHR 136,1 3 /dev/pts/1" `3 U7 b& @. P5 G3 B$ n; q
bash 3174 root 1u CHR 136,1 3 /dev/pts/1
/ A+ Y! \2 i" A$ c6 B6 \bash 3174 root 2u CHR 136,1 3 /dev/pts/1( v$ ^$ ?$ Q" ]; v
bash 3174 root 255u CHR 136,1 3 /dev/pts/1# l+ }$ V6 {- C4 e
在/proc中查看打开的文件# t- v( c2 H; Q" S3 d  Q0 ]" ]
ls -l /proc/3174/fd
) \& p: n* R2 u% }. L6 t% c6 Vtotal 0
" P+ n/ [% V" J  O" r; c' f" k/ G' I  z- P
lrwx------ 1 root root 64 2010-10-10 13:13 0 -》 /dev/pts/1
9 o& b/ ^& r: c# G" V& alrwx------ 1 root root 64 2010-10-10 13:13 1 -》 /dev/pts/1
! q& F; L6 s) ^- wlrwx------ 1 root root 64 2010-10-10 13:13 2 -》 /dev/pts/1
; d8 @' z1 j% {; C9 G/ a' h% o: j! Zlrwx------ 1 root root 64 2010-10-10 13:15 255 -》 /dev/pts/1
  i( D- ?+ ]4 r# F, ^+ E% P我们发现lsof不只是显示文件描述符,在lsof输出的最后四个文件是该进程的打开文件的文件描述符,0u代表的文件描述符为0,而255u代表的文件描述符为255,u的意思为可读可写。1 F# W% n' c. L! _( x0 c3 k7 Y- N
除了这四个文件描述符外,在FD一栏还有cwd,rtd,txt,mem等几种类型,它们的意义如下:" P- Y: u* x; ?3 k9 d3 O- [
cwd代表当前目录,这里是/root. d. J5 D' v& z3 `2 K
rtd代表根目录,这里是/
8 T! P. A7 p" N' p1 C$ s) f! Ltxt代表执行的程序,这里是/bin/bash
- V% A6 z7 y$ O; ?5 Dmem代表映射到内存的文件,这里是/lib/libc-2.7.so等动态链接库
" ?7 h' k# Z. G3 x( v& v/ l  D# @& @TYPE一栏表示文件/目录的类型,DIR代表目录,REG代表普通文件,CHR代表字符设备。
9 r6 k- t( b) W2 i  ^我们在伪终端1,执行vi -d /etc/hosts /etc/mtab
; d. m& N$ J. `% g在伪终端2,用lsof查看打开的文件。3 b0 t: m& o8 C  u- z% j2 {/ J
lsof -p 61952 o* J0 d5 o( j# y+ Y+ A6 ~
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME! Y# f+ O' ~  i3 D* L" `5 W" a
vi 6195 root cwd DIR 0,3 0 1 /proc" L. d  {) K, H& w, S6 i# E, c
vi 6195 root rtd DIR 8,1 4096 2 /5 i/ h. O  S, J* J5 v) J( z: Z2 H& H
vi 6195 root txt REG 8,1 1699024 686572 /usr/bin/vim.basic
. a/ W' W. x; z8 f9 }vi 6195 root mem REG 8,1 47520 147727 /lib/libnss_files-2.7.so- d1 X: u* u% m- z5 @' g4 m
vi 6195 root mem REG 8,1 43472 147716 /lib/libnss_nis-2.7.so( E5 j* H& C4 ]4 r) n, ^
vi 6195 root mem REG 8,1 88968 147720 /lib/libnsl-2.7.so
8 R5 t" y! e/ t( f* Evi 6195 root mem REG 8,1 31536 147722 /lib/libnss_compat-2.7.so
: ^1 d. z& w5 y0 ovi 6195 root mem REG 8,1 4636768 782032 /usr/lib/locale/locale-archive
1 L7 p% I9 f. p+ D. }; F5 evi 6195 root mem REG 8,1 17424 147652 /lib/libattr.so.1.1.07 z, d% T8 y2 v. b8 Z; B) q
vi 6195 root mem REG 8,1 14616 147734 /lib/libdl-2.7.so
% W/ L+ T2 v# |0 l' ~% [vi 6195 root mem REG 8,1 1375536 147730 /lib/libc-2.7.so# ~3 W1 e4 o) x; j9 I
vi 6195 root mem REG 8,1 23616 767588 /usr/lib/libgpm.so.2.0.0
5 O% k$ p/ E1 h- X, u, |vi 6195 root mem REG 8,1 29360 147707 /lib/libacl.so.1.1.0  f2 H& i( y$ O6 C
vi 6195 root mem REG 8,1 109464 146602 /lib/libselinux.so.1; Y: o6 v4 U7 M
vi 6195 root mem REG 8,1 256288 147710 /lib/libncurses.so.5.7
, x$ x3 s; B( i7 M2 fvi 6195 root mem REG 8,1 119288 147733 /lib/ld-2.7.so
. f( P$ n" J3 _% [9 w/ m1 G7 m1 jvi 6195 root 0u CHR 136,0 2 /dev/pts/0
* G# u5 e1 _+ a. \6 ~7 P' e3 }vi 6195 root 1u CHR 136,0 2 /dev/pts/02 P$ o4 F, r3 _% \9 a# S# \5 ^
vi 6195 root 2u CHR 136,0 2 /dev/pts/0
( n# Q4 h3 X( W/ Avi 6195 root 4u REG 8,1 12288 480777 /etc/.hosts.swp8 c. ~3 {( r4 R* s6 q
vi 6195 root 5u REG 8,1 12288 482077 /etc/.mtab.swp$ \5 a& x6 E6 Q" W9 M
我们看到vi创建了临时文件/etc/.hosts.swp和/etc/.mtab.swp,同时它的执行程序是/usr/bin/vim.basic,应该是确实是vi的二进制程序。
7 q& E. B6 i9 |# ?& R/ F" [cwd是/proc,说明伪终端1下的当前目录是/proc。: x$ S8 c# h6 H) Q
其实我们可以通过w确认当前系统的伪终端,再通过lsof|grep ’pts/0‘查看使用该伪终端的PID,最后用lsof -p PID查看该用户在做什么。
/ S; V& V! M7 X  F9 o如果有具体的用户名,可以直接用lsof -u username来查看该用户当前加载的文件。7 e' m, h" Q; V$ I& x) [5 Q
五)文件描述符的限制
+ I, y7 f1 ]2 b' ~每个进程允许打开文件的实际数目是由内核决定的,但是可以使用sysconf函数在运行时进行查看。如下:$ a1 V" W3 ^, {1 u6 P
vi process_limit.c
. X& |$ \/ `  y5 F: B3 y& j源代码如下:
- N3 p* C) Y; ]: l0 G4 `- o#include 《stdio.h》
. B; N" O3 M/ |#include 《stdlib.h》0 P) d3 r5 ~( K* K! n9 Y# W
#include 《unistd.h》5 I3 F% K( m$ t  d
int& _: d/ V- z. K
main (int argc,char *argv[])7 ~+ g3 ]7 c- l5 [- y
{$ y  ~/ A# z2 p5 y/ m7 M. O
u_long process;
( x6 O$ O2 ]& T% B; ^1 p" ?! Vprocess = sysconf(_SC_OPEN_MAX);
; V; |; ?1 D6 y" c6 u* X# bprintf(“current process total:%lu\n”, process);8 V- {: D" j- C4 ~1 P
return 0;, f7 ?4 l& X6 u( O
}
9 l2 x- A" Q$ n( ^编译链接:! H& S# ]# e/ h+ |
gcc process_limit.c -o process_limit
1 X: S7 q' R, t% E5 o  D0 R。/process_limit2 C; ^$ ~$ T* V! u7 f
current process total:8192002 x, o7 t- ?/ O- ^# t
进程可以打开文件的总数为819200,与ulimit -n(打开文件的总数)一致.z
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-4 21:13 , Processed in 0.176480 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表