lockf() 请教
下面的这个程序加锁和不加锁输出的结果有区别吧? 我试过了 是的区别的但是有的人说:“不同进程之间不存在共享临界资源(其中打印机的互斥性已由操作系统保证)问题,所以加锁与不加锁效果相同。” 这个对吗
. o# n$ Z( _( [* D" p$ X. J9 S- |6 [ M0 P* X
#include<stdio.h> # c& n$ e& A6 l3 |
#include<unistd.h>
# Z" k$ g& E$ I. C! I- O$ {main( )) q/ H& X; e5 R! H% ?7 T+ k
{% x& d6 r: w8 ^1 l
int p1,p2,i,j;
- d- z8 C" a. u' j3 Twhile((p1=fork( ))==-1); /*创建子进程p1*/
# \0 {1 P) n; s6 bif (p1==0)
" e( Y+ q" E4 s{
2 a0 X# {5 F% e' b% z) y9 M5 o, X" zlockf(1,1,0); /*加锁,这里第一个参数为stdout(标准输出设备的描述符)*/) y& L: w# _# }$ D$ o
for(i=0;i<1000;i++)
# ]( w: ^( |' _& Z9 {for(j=0;j<1000000;j++)& ?" f# |& h2 ~4 G6 \
if(j==0)
; X: m y6 i$ o0 \4 w4 J( ~! dprintf("daughter daughter daughter daughter daughter daughter daughter %d\n",i);
/ b1 R M, R8 U2 xlockf(1,0,0); /*解锁*/
# i6 j9 f; F' V5 y0 s}2 }6 u( B9 y& N4 b
else {
2 K" }+ N; g9 H2 S Uwhile((p2=fork( ))==-1); /*创建子进程p2*/( ]% x9 Q' ~; @0 s/ n4 R
if (p2==0)/ z& R; x: r4 n$ K4 v: m0 w4 Z
{
5 k L( f) x7 w* [8 `" Dlockf(1,1,0); /*加锁*/
! s3 d8 K) ~: L, }% D) M8 xfor(i=0;i<1000;i++)1 Z! D2 Y8 |+ A. k; }1 H
for(j=0;j<1000000;j++)- `2 m7 T6 |. H+ ?" G
if(j==0)
/ I9 m% n0 L) c$ {2 R) [# _printf("son son son son son son son son son son son son son son %d\n",i);) Q& S7 V1 ]5 W) T7 I. u6 e/ G! B
lockf(1,0,0); /*解锁*/
0 N6 t9 f! M. J! J}
6 M) V2 E5 B/ }8 Y1 aelse) @/ k3 ^4 e3 [
{" P- V' ]' p8 h0 s
lockf(1,1,0); /*加锁*/
- c$ t V( f* d. n1 vfor(i=0;i<1000;i++)2 x' |3 R; k, L2 n' J
for(j=0;j<1000000;j++)% V7 u# x; q" A5 g" R2 E9 n
if(j==0)
& ^# p' Q# m3 s4 l0 A/ rprintf("parent parent parent parent parent parent parent parent parent %d\n",i);1 q: U( [/ _) r+ `: V- \
lockf(1,0,0); /*解锁*/
6 ^ t1 r7 a, C}+ C* z0 f' @2 W
}
3 i* p& u' F( n! u% o}
G& V3 t& L- J& a; K0 [/ Z
* @* o0 Y: d) p' e而且,我还不明白,为什么lockf()第一个参数是1? 又试了试改成0或者2结果和1是一样的。但是改成10或者是其他的,结果又和没加锁不一样了。 这个参数不是指定加锁的文件吗?那按理说 应该是0(在子进程中,pid=0)才对啊。
7 g5 u, H$ J9 H3 g; s
8 g4 v. D# |4 y+ e+ e1 y, |* I3 }十分的迷茫。期待有人解释下。。。。
$ W6 g# Q( S) h" H5 M- A3 l8 X4 Q/ t