举例说明prctl在C语言中的使用方法

697 阅读2分钟

在C语言中,prctl系统调用被用来操作调用函数或进程活动的各种特性。prctl "系统调用的第一个参数定义了对头中初始化值的处理。所有其他的参数将按照第一个参数及其价值来使用。让我们深入了解一下C语言中的 "prctl "系统调用,在实施本文时,我们一直在Ubuntu 20.04上工作。

例子01:

打开并登录Ubuntu 20.04,从活动区启动名为 "终端 "的应用程序。这可以通过利用桌面上一个简单的快捷键 "Ctrl+Alt+T "来完成。创建一个C型文件来实现prctl()系统调用,执行下面的快照中显示的命令。

$ touch prtcl.c

创建完毕后,让我们按照所示指令用GNU Nano编辑器打开该文件。

$ nano prtcl.c

在GNU文件中添加下面snap图片中的代码。这段代码包含了prctl()代码工作所需的头文件。然后我们创建并定义了4个线程,名为process1、process2、process3和process4。所有4个进程或函数都包含void作为一般参数或签名参数,但它也可能是其他的东西。正如我们之前所阐述的,"prctl() "系统调用的第一个参数将显示我们要对调用函数做什么。所以,我们在4个方法中都调用了prctl(),通过使用 "PR_SET_NAME "参数来设置一个进程的名称。在2秒钟的睡眠之后,puts函数将被执行,以设置进程的名称。

然后,我们声明了一个名为 "fp "的数组类型的指针,其元素包含4个方法或进程的名称。主方法在这里声明了一个变量 "id",表示进程。这里使用了 "for "循环,用 "fork() "方法为每个父进程创建一个子进程,并将其保存到变量 "int"。if "语句被用来检查 "id "是否为0,如果满足条件,它将打印出子进程编号,"fp "数组将被用作获取第一个元素的方法,即进程1,以此类推直到循环结束。以这种方式调用方法将使它执行上面定义的所有方法。

先编译该文件。

$ gcc prctl.c

该文件的执行显示了以下输出。每个进程的名称已经被设置。

$ ./a.out

例子02:

让我们再来看看prctl的说明。让我们打开prctl.c文件。

$ nano prctl.c

在包含头文件之后,方法 "cap_1 "已经被初始化。文件描述符 "f "已被定义,变量 "res "已被初始化为值"-1"。现在,文件描述符将被用来从内核获得最大的能力。文件描述符将从内核文件夹中以只读方式打开文件。如果文件描述符得到的字符超过0,"buf "数组将被定义为32大小。两个整数已经被定义,读取方法已经被用来从使用文件描述符的缓冲区获取数据,并保存到变量 "num "中。如果变量 "num "的值大于0,变量 "num "的索引匹配值将被初始化为Null。sscanf "方法将把 "res "指针与 "buf "数组绑定,并将其存储在变量 "r "中。这就是如何从内核中获得最大的能力。如果变量 "r "的值不等于1,它将再次用"-1 "更新 "res "的值。最后,该描述符被关闭。

第二个方法,"cap_2 "被用来初始化能力变量等于0,prctl()方法使用 "PR_CAPBSET_READ "来读取最大能力。如果能力的值大于0,它将被递增。当能力达到0时,它将停止递增,并返回 "cp "值,递减为1。

主方法是从 "cap_1 "和cap_2中获取能力,并在条件满足时打印出来。

这个文件的编译和运行显示,最大容量值是40。

$ gcc prctl.c

$ ./a.out

总结

在本指南中,我们讨论了两个例子来阐述C语言中的prctl()系统调用,这将对你有很大的帮助,因为我们已经用两个不同的参数演示了它。