Linux系统内核首次加入锁定功能

Linux系统内核首次加入锁定功能,第1张

Linux之父林纳斯·托瓦兹(Linus Torvalds)上周六宣布在新版Linux系统内核中首次加入锁定功能。

这项名为“lockdown”的Linux内核新安全功能将作为LSM(Linux安全模块)出现在即将发布的Linux 5.4版本当中。

该功能默认情况下处于关闭状态,由于存在破坏现有系统的风险,因此用户可选使用。这项新功能的主要目的是通过防止root帐户与内核代码进行交互来加强用户态进程与内核代码之间的鸿沟。

启用后,新的“锁定”功能将限制Linux某些内核功能,即使对于root用户也是如此,这使得受到破坏的root帐户更难于破坏其余的系统内核。

托瓦兹表示:“启用后,各种内核功能都受到限制。 ” 这包括限制对内核功能的访问,这些功能可能允许通过用户级进程提供的代码执行任意代码;阻止进程写入或读取/ dev / mem和/ dev / kmem内存;阻止对打开/ dev / port的访问,以防止原始端口访问;加强内核模块签名等。

Linux是一种自由和开放源码的类UNIX *** 作系统。该 *** 作系统的内核由林纳斯·托瓦兹在1991年10月5日首次发布。在加上用户空间的应用程序之后,成为 Linux *** 作系统。Linux也是最著名的自由软件和开放源代码软件。只要遵循GNU 通用公共许可证(GPL),任何个人和机构都可以自由地使用Linux 的所有底层源代码,也可以自由地修改和再发布。

管道就是我们生活中看到的净水,它有两个水口,一个连接着进水管,一个连接着出水管,通过这个管道,我们就可以把水流一步步过滤处理,最终输出我们想要的净水。

linux中的管道也是同样的道理,它使用|表示。

比如我们经常看到统计排序的例子

为了避免死锁并利用并行性,通常,带有一个或多个新管道的Unix进程将调用fork()创建新进程。然后,每个过程将在产生或使用任何数据之前关闭将不使用的管道末端。或者,进程可以创建一个新线程并使用管道在它们之间进行通信。

也可以使用mkfifo()或创建命名管道mknod(),然后在调用它们时将它们作为输入或输出文件呈现给程序。它们允许创建多路径管道,并且在与标准错误重定向或结合使用时特别有效。

#include <stdio.h>

main()

{

int i,r,p1,p2,fd[2]

char buf[50],s[50]

pipe(fd)//创建匿名管道,fd[0]为读端,fd[1]为写端

while((p1=fork())==-1)//创建子进程P1,直至成功为止(p1!=-1)

if(p1==0) //子进程P1执行逻辑

{

lockf(fd[1],1,0)//锁定管道写端,保证写入数据的完整性

sprintf(buf,"child process P1 is sending messages!\n") //在buf中填入准备写入管道的信息数据

printf("child processP1!\n")//打印“子进程P1正在运行”

write(fd[1],buf,50)//向管道写端fd[1]写入buf中的数据,写完后该数据即可以从读端fd[0]读出

sleep(5)//睡眠5秒

lockf(fd[1],0,0)//解锁管道写端

exit(0)//子进程P1退出

}

else //主进程的执行逻辑

{

while((p2=fork())==-1)//创建第二个子进程P2

if(p2==0) //子进程P2的执行逻辑

{

lockf(fd[1],1,0)//锁定管道写端,保证数据写入完整

sprintf(buf,"child process P2 is sending messages!\n")//在buf中填入准备写入管道的信息数据

printf("child processP2!\n")//打印“子进程P2正在运行”

write(fd[1],buf,50) //向管道写端fd[1]写入buf中的数据,写完后该数据即可从读端fd[0]读出

sleep(5) //睡眠5秒

lockf(fd[1],0,0) //解锁管道写端

exit(0)//子进程P2退出

}

//以下为主进程执行逻辑

wait(0)//等待某个子进程退出

if(r=read(fd[0],s,50)==-1) //从管道读端fd[0]读取P1或者P2写入的数据(视哪个子进程抢先执行到lockf函数)

{

printf(:can't read pipe\n") //读取失败,打印错误信息

}

else

{

printf(:%s\n",s)//打印出读到的信息数据

}

wait(0)//等待第二个子进程退出

if(r=read(fd[0],s,50)==-1) //从管道读端fd[0]读取出P1或者P2写入的数据(视哪个子进程后执行到lockf函数)

{

printf(:can't read pipe\n")//读取失败,打印错误信息

}

else

{

printf(:%s\n",s)//打印读取到的信息数据

}

exit(0)//主进程退出

}

}

总的说来,就是主进程创建了两个子进程P1、P2,这两个子进程分别向管道写入了一行文字,然后主进程从管道另一端将这两行文字读出并打印出来

由于进程的并发执行性,哪个子进程的信息先写到管道是随机的,因此该程序每次运行的输出可能并不相同,两行文字之间可能会相互交换


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7302254.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-04
下一篇2023-04-04

发表评论

登录后才能评论

评论列表(0条)

    保存