免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 雨丝风片
打印 上一主题 下一主题

[FreeBSD] 【FreeBSD system programming 】中文翻译计划及所有异义提交处 [复制链接]

论坛徽章:
0
126 [报告]
发表于 2006-02-23 12:13 |只看该作者
建议翻译完成后能不能由CU组织印制,然后由我们来邮购,反正也是要打印出来看的。钱可以分给译者、CU等,也算是作为对译者辛苦的一点回报。以后再接再劢译出更多好的文章。

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
125 [报告]
发表于 2006-02-21 13:26 |只看该作者
原帖由 雨丝风片 于 2006-2-21 12:33 发表
偶负责的第六章还差20%了,


我也还差10%左右了。

论坛徽章:
0
124 [报告]
发表于 2006-02-21 12:33 |只看该作者
偶负责的第六章还差20%了,

论坛徽章:
0
123 [报告]
发表于 2006-02-20 17:24 |只看该作者
原帖由 horseman 于 2006-2-20 17:08 发表
***继续,麻烦楼主帮忙调整一下相关代码的格式,我不会使用这个论坛的跟格式相关的功能***

5.3文件上锁
当多个进程试图写同一个文件,将发生什么?它们相互冲突,已知的事情像文件上锁。结果就是每个文件描都 ...


紧挨着你的编辑框的上面不是有一排按钮么,上面都有提示的,连猜带摸索不就会了?呵呵!

论坛徽章:
0
122 [报告]
发表于 2006-02-20 17:08 |只看该作者
***继续,麻烦楼主帮忙调整一下相关代码的格式,我不会使用这个论坛的跟格式相关的功能***

5.3文件上锁

当多个进程试图写同一个文件,将发生什么?它们相互冲突,已知的事情像文件上锁。结果就是每个文件描都有自己的描述符跟偏移量,当每个进程写自己的文件时,偏移量预先独立导致没有进程知道其他的进程也正在执行写操作。最后的文件将因为多个独立写文件的操作使混合后的文件变得相当于垃圾,直接给文件上锁是解决这个问题的一种方式。在任意时刻只能让一个进程能够写到文件,另一种办法是允许在一个叫做高级文件锁的scheme里的文件内部进行区域锁定。fcntl函数能够提供这个功能,通常来说,锁有两种,一种是写,另一种是写,不同之处在于读锁不会干扰其它进程读取文件,但是特定的区域只能一个写锁存在。

当使用顾问锁的时候,下面的结构用作fcntl的第三个参数。

  1.   struct flock {
  2.             off_t   l_start;    /* starting offset */
  3.             off_t   l_len;      /* len = 0 means until end of file */
  4.             pid_t   l_pid;      /* lock owner */
  5.             short   l_type;     /* lock type:   */
  6.             short   l_whence;   /* type of l_start */
  7.     };
复制代码


让我们继续讨论每个元素的细节。

l_start

这是一个相对于l_whence,单位为字节的偏移量,换句话说,要求的位置实际上是l_whence + l_start

l_len

需设置为期望位置的长度,单位为字节,锁将从l_whence + l_start开始锁定l_len字节,如果你想整个文件用一把锁,那么设定l_len的值为0,如果l_len的值是一个负数,结果是不可预测的。

l_pid

需要设置为工作在锁上的进程的ID

l_type

需要设置为期望的锁的类型,下面是能够使用的值

    * F_RDLCK - 读锁定
    * F_WRLCK - 写锁定
    * F_UNLCK - 用作清除锁定

l_whence

这是这个系统调用里面最混乱的部分,这个字段将决定l_start位置的偏移量,需要设为:
    * SEEK_CUR - 在当前位置
    * SEEK_SET - 在文件开始
    * SEEK_END - 在文件末尾

fcntl的命令

下面的可用作fcntl的命令

  1. #define  F_GETLK      7
复制代码


F_GETLK命令尝试检查否能上锁,当使用这个命令,fnctl将检查是否有相冲突的锁,如果存在相冲突的锁,fnctl将改写flock结构,用冲突锁消息通过检查,如果没有相冲突的锁,那么在flock结构最初的信息将被保留,除非l_type字段被设成F_UNLCK

  1. #define  F_SETLK      8
复制代码


F_SETLK命令试图获得flock结构描述的锁,如果锁不被承认,本次调用将不被阻塞。不管怎样,fcntl将直接返回EAGAIN,同时将设置相应的errno,当flock结构的l_type被设置为F_UNLCK时,你能够使用这个命令清除一个锁。

  1. #define  F_SETLKW     9
复制代码


F_GETLK命令试图获得flock结构描述的锁,它将命令fnctl阻塞,直到赋予一个锁

[ 本帖最后由 雨丝风片 于 2006-2-27 12:25 编辑 ]

论坛徽章:
0
121 [报告]
发表于 2006-02-20 13:01 |只看该作者
原帖由 gvim 于 2006-2-20 11:23 发表
4.4 信号处理
现在我们知道何时会产生信号,也知道如何发送信号,那么我们怎么处理它们呢?

signal函数

signal系统函数调用提供了一种最简单的范例。然而,由于C原形声明的缘故使它看起 ...



快啦快啦!我剩下的那点儿也要赶快了。。。

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
120 [报告]
发表于 2006-02-20 11:23 |只看该作者
4.4 信号处理
现在我们知道何时会产生信号,也知道如何发送信号,那么我们怎么处理它们呢?

signal函数

signal系统函数调用提供了一种最简单的范例。然而,由于C原形声明的缘故使它看起来比实际复杂。signal函数将一个给定的函数和一个特定的信号联系。这里是FreeBSD中的定义(和一个typedef一起):
typedef void (*sig_t) (int);

sig_t   signal(int sig, sig_t func);

第一个参数是目标信号,可以是上面列举的所有信号中的任何一个。func参数是一个指针,指向某个处理该信号的函数。这个处理信号函数带有一个int型参数,并应返回void。signal函数中的func参数也可以设定为下面的一些值:
SIG_IGN: 如果func参数被设置为SIG_IGN,该信号将被忽略。

SIG_DFL: 如果func参数被设置为SIG_DFL,该信号会按照确定行为处理。


sigaction函数

sigaction函数是一个比signal更通用的方案。第一个参数是目标信号。下一个名为act的参数(指向)sigaction结构,该结构包含一些用于信号处理的信息。最后一个参数oact是一个指针,指向一个可以存储上一次设置信号处理的信息的地方。
int  sigaction(int sig, const struct sigaction *act, struct sigaction *oact);

sigaction结构有下面这些个成员:
void     (*sa_handler)(int);

这个结构成员是一个指向函数的指针,该函数带有一个简单的整形参数,并返回(void)。这与signal函数的func参数相同,也可以被设置为SIG_IGN和SIG_DFL,并且与调用signal得到的效果也一样。
void     (*sa_sigaction)(int, siginfo_t *, void *);

该结构成员是一个指向函数的指针,返回(void)并需要三个参数。这些参数依次为:一个整形参数指定信号发送;一个指向siginfo_t结构的指针用来保存关于信号的信息;最后一个也是一个指针,指向信号交付时的特定上下文(context)空间。
sigset_t sa_mask;

该结构成员是一个位掩码(bitwise mask),用来指示信号交付时哪些信号会被阻塞。阻塞SIGKILL和SIGSTOP信号的做法会被忽略。接下来,被阻塞的信号将被推迟,直到它们被开启(unblock)。参见sigprocmask获得更多关于全局掩码(global masks)的信息。
int      sa_flags;

该数据成员是一个拥有下面这些标志的位掩码:
SA_NOCLDSTOP: 如果SA_NOCLDSTOP位被置位并且目标信号是SIGCHLD,除非子进程退出,而在子进程停止(stop)时父进程将不会收到通知。

SA_NOCLDWAIT: SA_NOCLDWAIT标志会阻止子进程成为僵尸进程。在目标信号是SIGCHLD的时候使用。如果进程设置了这个标志,接着调用某个wait系统调用,进程将被阻塞直到子进程全部终止,最后返回-1(译注:此处在APUE2ed中的解释是返回1),设置errno全局变量为ECHILD。

SA_ONSTACK: 一些时候需要在特定的堆栈上进行信号的处理。sigaction系统调用提供了这个方式。如果该位被置位,那么信号将会被交付到指定的堆栈上。

SA_NODEFER: 如果SA_NODEFER位被置位,那么当前信号正被处理时,系统不会屏蔽该信号以后的交付。

SA_RESETHAND: 如果SA_RESETHAND被置位,一旦信号被交付,信号处理句柄将被置为SIG_DEF。

SA_SIGINFO: 被置位时,由结构体sigaction 的成员sa_sigaction指向的函数被使用。注意:使用SIG_IGN或SIG_DFL时不应该设置这个标志。成功调用sigaction之后,返回0或-1,并且将error设置成相关错误值。


4.5信号掩码(阻塞与开启信号)

进程可以阻塞或设置某个信号。一旦该信号被阻塞,关于它的交付将被推迟,直到进程重新开启它。在这样的情况下是非常有用的:进程进入代码中某个部分,不能被中断但仍希望可以接受、处理可能丢失的信号。可靠交付信号的能力直到4.2BSD引入之后(不久被SVR3采用),操作系统才拥有该能力。

随着可靠信号的出现,信号的生命和交付(life and delivery)都有所改变。信号可以在之前产生和交付。现在,一旦信号是挂起的(pending),进程可以在接收它之前决定怎么处理。进程可能会去处理它,也可能设置为缺省行为,或者丢弃信号

注意:如果许多信号都挂起,系统将会首先交付会改变进程状态的信号,例如SIGBUS。

sigprocmask

任何进程可以使用sigprocmask函数来阻塞信号。语法如下:
int     sigprocmask(int how, const sigset_t *set, sigset_t *oset);

sigprocmask函数会修改或检查(modify or examine)当前信号掩码。当set参数不是null的时候,sigprocmask的行为和第一个参数how有关。函数行为和相关意义列举如下:
SIG_BLOCK: 在set参数中指定的信号被阻塞,并且添加进阻塞信号列表。

SIG_UNBLOCK: 在set参数中指定的信号会从信号掩码中移除。

SIG_SETMASK: set参数将完全替代当前信号掩码。如果oset参数不为null,则会被设置为前一个信号掩码。如果set值是null,how参数被忽略并且信号掩码保持不变。所以,为了检查信号掩码,我们可以将传入set null值,oset为非null值来调用sigprocmask函数。一旦掩码得到之后,你可能需要对他进行检查或操作。可以使用下面的过程(routine)。注意当前这些过程是宏的实现。
  1. int    sigemptyset(sigset_t *set)
复制代码

如果调用这个过程,set参数将被初始化指向一个空信号集。
  1. int    sigfillset(sigset_t *set)
复制代码

如果调用这个过程,set参数将被初始化指向一个包括所有信号的信号集。
  1. int   sigaddset(sigset_t *set, int signo)
复制代码

如果调用这个过程,signo指定的信号将被添加进set参数指定的信号集。
  1. int    sigdelset(sigset_t *set, int signo)
复制代码

如果调用这个过程,signo指定的信号将从set参数指定的信号集中移除。
  1. int   sigismember(const sigset_t *set, int signo)
复制代码

如果调用这个过程,如果由signo指定的信号存在于set参数指定的信号集中时,返回1,否则返回0。
  1. int     sigpending(sigset_t *set);
复制代码

进程可以使用sigpending函数去查出当前那些信号被挂起。sigpending函数会返回一个包含所有挂起信号的掩码。该掩码可以使用上面介绍的过程去检查。sigpending成功时返回0,否则返回-1,并且设置errno为相应错误值。

(怎么还有25%呢)

[ 本帖最后由 gvim 于 2006-2-20 11:24 编辑 ]

论坛徽章:
0
119 [报告]
发表于 2006-02-19 18:27 |只看该作者
原帖由 孙轩 于 2006-2-18 17:29 发表
3.5是子进程 pdf里写成子例程了


已经改正

论坛徽章:
0
118 [报告]
发表于 2006-02-18 17:29 |只看该作者
3.5是子进程 pdf里写成子例程了

论坛徽章:
0
117 [报告]
发表于 2006-02-18 16:17 |只看该作者
原帖由 horseman 于 2006-2-18 14:04 发表
***继续,修复了先前版本翻译不是很妥的地方,不知道代码怎么插入,帮忙整理整理格式,多谢***

本章示范(示例)代码:http://www.khmere.com/freebsd_book/src/05/index.html


5.1  基本输 ...


帮你修改了一下代码格式,你看看还行不行?

已经将这部分添加到发布贴里去了,进度条也已更新!
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP