Unix/Linux核心编程:sa_flags选项详解

需积分: 12 5 下载量 190 浏览量 更新于2024-08-19 收藏 4.67MB PPT 举报
本文主要介绍了在Unix/Linux核心编程中与信号处理相关的`sa_flags`选项,这些选项在处理系统信号时扮演着重要角色。同时,文章提到了Unix/Linux操作系统的概述,包括其历史、主要派生版本以及与Linux的关系。 在Unix/Linux系统编程中,信号(signal)是一种异步通信机制,用于通知进程发生了特定事件。`sa_flags`参数在`struct sigaction`结构体中使用,用于定义信号处理的特性。以下是`sa_flags`选项的详细说明: 1. **SA_NOCLDSTOP**: 如果设置这个标志,当子进程被暂停时,父进程不会收到SIGCHLD信号。这允许父进程避免处理子进程的停止状态。 2. **SA_NOMASK/SA_NODEFER**: 这个标志指示在处理信号的过程中,即使信号再次发生,系统也不会屏蔽该信号。这意味着信号处理函数执行完毕之前,信号可以再次触发。 3. **SA_RESTART**: 当设置了这个标志,如果信号导致了一个系统调用被中断,那么系统调用会被自动重试,而不是返回错误EINTR。 4. **SA_ONSTACK**: 如果指定,当信号发生时,系统会在替代栈上执行信号处理函数,而不是当前的堆栈。这有助于防止因信号处理函数导致的堆栈溢出。 5. **SA_NOCLDWAIT**: 当处理SIGCHLD信号时,如果设置了这个标志,子进程终止后不会成为僵尸进程。父进程后续调用wait()会阻塞,直到所有子进程都终止,这时wait()会返回-1。 6. **SA_NODEFER**: 类似SA_NOMASK,表示在信号处理函数执行期间,系统不会自动阻塞该信号的再次到来。 7. **SA_ONESHOT/SA_RESETHAND**: 这两个选项含义相同,表示在调用新的信号处理函数前,将该信号的处理方式恢复为默认的SIG_DFL,即忽略信号或者执行默认行为。 8. **SA_SIGINFO**: 使用这个标志,信号处理函数可以接收额外的信息,例如`siginfo_t`结构体,提供更详细的信息关于触发信号的原因。 除了`sa_flags`选项,课程还涵盖了Unix/Linux操作系统的基础,如GCC编译工具、内存管理、文件I/O、进程管理、信号处理、进程间通信、多线程和网络通信等主题。从历史上看,Unix操作系统由AT&T的贝尔实验室开发,后来派生出System V、Berkley和Hybrid三个主要版本,其中Linux是一种开放源码的类Unix系统,广泛应用于各种硬件平台。Unix和Linux的家族树庞大且多样,包括AIX、Solaris、FreeBSD、NetBSD、OpenBSD以及苹果的MacOSX等操作系统。