![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Unix高级编程
文章平均质量分 53
白帽小丑
只是一个网络安全爱好者
展开
-
死锁的总结
缺点最明显的就是顺序是固定的,我们前面研究了司机和售票员进程,售票员的进程是不可以在司机前的,所以如果是这个算法就有问题,其次就是运行前要用大量资源,以及进入系统的进程个数资源(进程序列)是规定好的,如果有新的进程进来,重新算又要耗费资源。第三个占有和等待,如果p1进程一直占用p2进程想要的资源,那么我将p1进程中p2需要的资源释放出来,让给p2,这样就可以解决p1占用资源和p2一直等待资源的问题,这个模型貌似是可行的。保守派是如何解决死锁的,根据前面,我们知道他们的思想是从源头切断死锁的出现。原创 2023-02-27 09:57:35 · 158 阅读 · 0 评论 -
信号量(下)实验
这里让两辆车并发,我们会发现结果会出问题,这里是因为两辆车是上车售票下车关着门这一系列事件是互斥的,所以需要进一步优化,我这里不优化了,继续优化需要更详细的模型,大家可以试下。规则图片中只有一个理发师,理发师一个时刻只能帮一个人剪头发,其他人需要坐在数量有限的椅子上。核心规则:不可以同时读和写(竞争),读者与读者之间不冲突(同步),写者与写者之间也竞争。哲学家们,只有同时拿到左边和右边的筷子才可以吃饭,除了吃饭其他事件都在思考。printf("开车门\n");printf("开车\n");原创 2023-02-27 09:53:24 · 117 阅读 · 0 评论 -
信号量(下)
我们这里可以看到互换之后如果是生产者先执行那么问题并不大,如果是消费者先执行,那么到达p(full)这里会一直等待,但是如果这个进程一直占用空间,那么生产者产生的进程又会一直等待,这里就是个死锁。上面这个缓冲区是有界的,那么如果我们要利用这个缓冲区存放更多的数据的话,那么我们需要让这个区域可以反复存取。buffer为空时,通知生产者要生产了,buffer满的时候,通知生产者停止生产。因为用户取的程序也是并发的那么我们取一个也是要前移,由于是循环,我们也需要取余。那么我们则可以用取余的办法去做。原创 2023-02-27 09:51:09 · 149 阅读 · 0 评论 -
unix高级编程-fork和execve
就像Python中的os.system(cmd)这个函数,我们可以用这个函数来执行我们的shell脚本,单独的shell命令,或者是调用其他的程序,我们的execve()这个函数就和Python中的os.system函数类似,可以调用其他程序的执行,执行shell命令,,调用脚本等等功能。格式开头的解释器参数参数。如果是后者,这个解释器必须是一个可执行的有效的路径名,但是不是脚本本身,它将调用解释器作为文件名。argv是要调用的程序执行的参数序列,也就是我们要调用的程序需要传入的参数。原创 2023-02-22 19:22:17 · 406 阅读 · 0 评论 -
unix高级编程-fork之后父子进程共享文件
/.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!我们放两个参数就可以了,第一个是文件指针(打开文件的路径),flags我们查看man手册,我们取O_RDWR读写属性。这里我看到的是centos的操作,但我用的是debian系的ubuntu,百度了一下发现debian的在这里。大家可以自行修改想要的编码,修改完重新执行一下用户文件,或者重启,或者重新登陆都是可以的。可以看到并发执行写入的顺序不可控,且是共享的。open打开文件参数。原创 2023-02-22 13:58:16 · 412 阅读 · 0 评论 -
unix高级编程-僵尸进程和孤儿进程
代表子进程死亡不给父进程发信号(ignore),也就是父进程创建子进程不给他“收尸”,那么系统会帮他“收尸”: 一个父进程利用fork创建子进程,如果子进程退出,而父进程没有利用wait 或者 waitpid 来获取子进程的状态信息,:一个父进程退出, 而它的一个或几个子进程仍然还在运行,那么这些子进程就会变成孤儿进程,我们还可以发送一个信号让程序帮我们回收产生的子进程。大家可以尝试改写我的代码,自己写一个孤儿进程。僵尸进程不为子进程“收尸”原创 2023-02-22 13:52:25 · 265 阅读 · 0 评论 -
unix编程-fork
进程因为创建或时间片轮转(抢断)而就绪,因为调度而运行,因为i/o操作过长而等待。这里可以看到stack并不共享,每个并发的进程都有自己的stack。操作系统fork大家可以看我前面的博客,这个章节以实践为主。linux创建0号进程用来调度其他进程。通常调度第一个1号进程(用户进程)linux内核态实现。原创 2023-02-22 13:50:59 · 74 阅读 · 0 评论