你可能听说过C语言中的套接字编程,其中一个套接字函数是 "sigprocmask "函数。这个函数在代码中通常被用来检查或改变调用函数的信号屏蔽。信号掩码是一个术语,用于表示一组目前被封锁的信号,不能为调用函数传达。这样的信号被称为 "阻塞的信号"。可以说,一个进程仍然可以接收被屏蔽的信号,但它将不会被使用,直到这些信号被解除屏蔽和释放,即被提出。在那之前,它将是待定的。因此,在今天的指南内,我们将讨论C语言编程中sigprocmask函数的使用。让我们先来看看。
在Ubuntu 20.04成功登录后,你需要在登录后首先启动Ubuntu 20.04系统的外壳。因此,在桌面屏幕上简单地尝试一下 "Ctrl+Alt+T "的快捷方式。它将在几秒钟内为你启动终端外壳。请确保使用你的系统的apt软件包更新你的系统。之后,你必须执行 "touch "指令以及你想要生成的文件名,也就是说,通过shell创建C文件。这个新创建的文件可以在你系统的文件资源管理器的 "home "文件夹中找到。你可以尝试用 "文本 "编辑器打开它,在其中创建代码。另一种在shell中打开它的方法是使用 "GNU Nano "编辑器,使用 "nano "关键字和下面演示的文件名。
例子01:
我们在 "nano "编辑器中开始了我们的代码,包括一些必要的C头文件。这些头文件可能是最常见的头文件,如 "stdio.h"、"unistd.h "和 "stdlib.h"。除此之外,最重要的头文件 "signal.h "也被添加进来,以利用C代码中的信号处理功能。所有的工作都已经在这个程序的main()方法中完成。因此,在启动该方法后,我们使用 "sigset_t "对象初始化了一些信号构造变量,即s、os和ps。s "代表信号,"os "代表一个原始信号集,"ps "代表一个待定的信号集。
sigemptyset "一直使用 "s "结构来初始化或声明一个信号掩码,并不考虑所有的信号。在这之后,"sigaddset "函数被用来将初始化的信号 "s "添加到指定的SIGINT信号集中。SIGINT信号处理程序是指 "Ctrl+C",即中断字符。它将停止当前进程的执行,并返回到主循环。
现在,这里的sigprocmask函数使用三个参数。SIG_BLOCK参数表明在信号集 "s "中发现的所有信号将被添加到当前的信号集中。&s表示指向一个特定的信号集的指针,这个信号集已经被用来改变 "SIGINT "结构的信号屏蔽。参数 "os "指向存储特定方法的信号掩码的信号集。printf语句在这里是为了显示信号集的旧信号屏蔽。"sigpending "函数用于保存信号集中待处理信号的相关数据。printf语句在这里再次使用 "ps "结构在shell上显示待定信号集。kill "方法出现在这里,通过 "getpid() "函数使用进程ID杀死当前进程。再次调用sigpending函数来获取集合中的待处理信号,printf语句将显示这些信号。sigprocmask函数使用 "SIG_UNBLOCK "预定义集来继续解除阻塞并提高待定列表中的函数。"s "信号集将在信号掩码 "os "的帮助下被释放。
在shell中使用下面所示的指令编译你的C代码文件。
你的文件已经被执行了。它将向你展示shell上的旧信号集 "os"。但是,由于 "s "集的信号现在被封锁了,我们将看到信号被接收,但正在等待,没有执行。我们不能杀死这个进程,因为信号的处理被阻止了。最后,我们已经释放了这些信号。
例子02:
让我们看看另一个例子,"sigprocmask "函数是C语言中用来封锁和解除封锁的特定信号集。所以,我们添加了一个新的文件并尝试了新的代码。首先,你需要在代码文件中添加相同的头文件,如下图所示。用户定义的 "catcher "函数在这里只是显示我们在这个函数里面,使用其printf函数。
主要的执行从我们代码的main()函数开始。它包含两个参数。首先,我们通过 "time_t "关键字利用时间结构 "s "表示开始,"f "表示结束。结构sigaction被声明为 "sact",用于设置自然界中做某事的信号。"sigset_t "结构用于声明两个信号集,即 "ns "表示新的信号集,"os "表示旧的信号集。双重类型变量 "dif "被声明。首先,sigemptyset函数用于初始化 "sact "结构的信号掩码并排除所有信号。sa_flags处理程序被用于sigaction的比特掩码,并被初始化为零。sa_handler "被用来声明 "catcher "函数作为使用 "sact "sigaction对象的信号处理。sigaction函数在这里被调用,使用SIGALRM为信号 "sact "设置报警。
在 "ns "信号集上利用了 "sigemptyset "来初始化一个信号掩码并排除所有的信号。sigaddset函数将SIGALRM添加到 "ns "信号集上。sigprocmask将 "ns "信号添加到当前的信号集中。os "信号集代表一个特定进程的信号屏蔽。开始时间已经被记录下来,并使用printf中的 "ctime() "函数打印出来。1秒的警报被初始化,完成时间已经被记录下来。使用 "difftime "函数计算完成时间和开始时间之间的差异。如果差值小于10秒,sigprocmask函数将使用 "os "信号集,用SIG_SETMASK替换特定进程的现有信号掩码。最后一条printf语句在这里是为了显示信号集被释放报警的时间。
在编译和运行该文件后,它向我们显示了报警信号集被封锁的时间。几秒钟后,捕获器函数被调用,另一条语句显示了报警信号集释放的解除阻塞时间。
总结。
这篇文章展示了关于C语言中sigprocmask函数的使用的解释。我们讨论了2个简单明了的例子来说明sigprocmask函数和其他信号函数的工作。我们希望这篇文章能给每一个刚接触信号的用户带来帮助。