发新话题
打印

lockf() 请教

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
      

TOP

还是不懂

1是不是代表标准输出呢?
% v1 Q. g/ _' X# f& k/ O4 x$ M加锁有没有对for( )循环起作用呢?! a, z4 y- K& B  {' a, l
为什么加了lockf(1,1,0);和lockf(1,0,0)输出的结果会有所不同呢?(没加的输出结果是一会输出son ...一会输出parent.....一会输出daughter.....这样交替。加了锁之后,为什么结果是一直输出,直到son....全部输出完了之后再parent.....然后再daughter.....' s4 V( ~& q! C9 q

6 Q. w* W. w8 y3 s/ O这是为什么 为什么  有人帮忙一下吗?4 x2 x# u: n7 Y2 S
* X( J" U1 d+ Y3 h
等待中。。。。。
2 g1 \0 r+ u3 P9 ]# M 0 h/ c: K& n9 X1 Q0 W
:confused:   :confused:   :confused:   :confused:   :confused:        

TOP

关于函数和参数的介绍使用,可以查man。第一个参数为1是输出。
- g2 i7 e% S) M6 W- b. Z2 y你楼顶的帖子说打印机和你的代码似乎没有关系,不过确实也不存在什么需要互斥的问题。你的代码对输出描述符加和解锁对输出肯定会有影响,所以会有不同。      
上帝说,有问题,找GOOGLE 写程序是很神圣的事情!同样只是装系统,卖菜的大娘会的事情不见得就跟卖菜一样了。

TOP

好久了 现在想来 大概知道了为什么 lockf(0,1,0) 加锁(标准输入加锁)也会对输出有影响了。
+ b+ j4 H2 m0 f. [9 |9 G( r: |' H- N! _! ?+ F+ x- F& A! `
应该是对任意一个文件描述符加锁都可以达到相同的效果(也是就parent son daughter会按顺序依次输出,而不会交叉),前提是这个文件描述符存在。实际上,这里的锁充当的是互斥的作用。# G) l  T; l! k* G- w

, m+ x$ U. b# c% g也就是说,当我们对一个文件加锁,不影响这个文件的使用的时候,我们就可以用它来实现进程间对某一资源的互斥操作,并不一定就是针对被加锁的文件操作,可以是别的资源。如前面将程序中的lockf(1,1,0)改成lockf(0,1,0)对标准输入加锁,也可以实现对标准输出的互斥操作。
4 y* @) R! U# A; C- N' U9 h
5 V, n2 P5 B1 {7 q不知是不是这个理. . . . . .      

TOP

那也要你说的对某一资源的互斥操作的进程都是靠对一个文件加锁来实现那才行的通吧。      
上帝说,有问题,找GOOGLE 写程序是很神圣的事情!同样只是装系统,卖菜的大娘会的事情不见得就跟卖菜一样了。

TOP

当然就是同对一文件加锁来实现互斥的了啊5 H/ p5 A- F! i, S
' L! C7 T7 U! ~) g4 W; O& ^9 N
呵呵      

TOP

发新话题