标签:style io os ar 使用 for sp strong 文件
自父进程继承
子进程所独有
随想杂谈
子进程通过继承整个地址空间的副本,从而父进程哪里继承了所有互斥量,读写锁和条件状态。如果父进程包含多个线程,子进程在 fork 返回以后,如果紧接着不是马上调用 exec 的话,就需要清理锁状态。 在子进程内部只存在一个线程,它是由父进程调用 fork 返回以后,如果父进程中的线程占有锁,子进程同样占有这些锁,问题就出在子进程同样占有这些锁——但子进程不包含这些占有锁的线程副本,所以子进程没有办法知道它占有的那些锁并且需要释放哪些锁。如果子进程从 fork 返回以后马上调用某个 exec 函数,就可以避免这样的问题。这种情况下,老的地址空间被丢弃,所以锁的状态无关紧要。
当然,不用exec,也可以使用pthread_atfork,在调用fork之前,线程先获取进程中所有锁,在调用fork后分别在父子进程中释放这些锁,从而父子可以重新获取和释放这些锁资源。
记录锁的继承和释放
1、锁与进程和文件两方面
a、当一个进程终止时,它所建立的锁全部释放;(即 进程退出,文件锁自动释放)
b、任何时候关闭一个描述符时,则该进程通过这一描述符可以引用的文件上的任何一把锁都释放。(即 关闭文件,文件锁自动释放)
情况一::
fd1 = open(pathname,....);
read_lock(fd1,....);
fd2 = dup(fd1);
close(fd2); //此时,在close(fd2)后,在fd1上加的锁被释放。
情况二::
fd1 = open(pathname,....);
read_lock(fd1,....);
fd2 = open(pathname,...);
close(fd2); //此时,在close(fd2)后,在fd1上加的锁被释放。
2、由fork产生的子进程不继承父进程所设置的锁。(文件锁不能被继承)
这意味着,若一个进程得到一把锁,然后调用fork,那么对于父进程获得的锁而言,子进程被视为另外一个进程,对于从父进程处继承过来的任一描述符,子进程需要调用fcntl才能获得它自己的锁。
(这其实也是锁的本意,文件锁的作用是阻止多个进程同时写一个文件或区域,如果子进程继承父进程的锁,则父、子就可以同时写同一个文件。这显然是不对的。)
3、在执行exec后,新程序可以继承原执行程序的锁。(EXEC文件锁被继承)
执行exec后,其实是用当前进程的进程实体替换原进程的进程实体。原进程被杀掉(但保留了 进程ID即 PID)
标签:style io os ar 使用 for sp strong 文件
原文地址:http://www.cnblogs.com/zhaoyl/p/4056771.html