linux操作系统之进程组及会话

(1)进程组(作业):代表一个或多个进程的集合。

          1)父进程创建子进程时,默认子进程与父进程属于同一进程组,进程组id==第一个进程id(组长id,父进程id)

          2)使用kill -SIGKILL -进程组id(负数)  将整个进程组杀死。

          3)只有进程组中还有进程存在,进程组就一直存在,与组长进程是否终止无关。

          4)进程组生存周期为进程组中最后一个进程存活时间。

          5)一个进程可以为自己或子进程设置进程组id(setpgid)

(2)进程组操作函数

         1)获取当前进程的进程组id:getpgrp

                     pid_t  getpgrp(void);           //返回调用者的进程组ID

         2)获取指定进程的进程组id:getpgid

                    pid_t  getpgid(pid_t pid);   //成功返回0,失败返回-1

                         pid=0时,该函数效果和getpgrp作用相同

        3)改变进程组默认所属进程组:setpgid(通常用来加入一个现有的进程组或创建一个新进程组)

                   int  setpgid(pid_t pid ,pid_t pgid);  成功:0 失败:-1

                      功能:将pid加入到pgid中

              注意事项:1>如果想要把子进程设置为新的组,应把setpgid放在fork函数之后,exec函数(执行完后不返回了)之前。

                                        2>改变进程组只有在符合自己权限的情况下才能改变。

(3)会话:一个或多个进程组的集合

          1)创建会话

                  1>创建会话的进程不能使进程组的组长,如果是组长进程,则会出错

                  2>创建会话的进程会成为新进程组的组长进程

                  3>一般linux需要root权限(ubuntu不需要)

                  4>新会话会舍弃原有的控制终端,该会话没有控制终端

                  5>建立新会话的顺序,先调用fork,父进程终止,子进程调用setsid函数创建会话,称为进程组组长和会话的会长。

          2)会话操作函数

                1>获取进程组所属会话id:getsid

                      pid_t getsid(pid_t pid)  成功:返回调用进程的会话id  失败:-1

                           pid=0    查看当前进程的会话id

                   ps ajx   参数j代表与控制作业相关的信息,参数a代表所有用户的进程,参数x代表所有控制终端和无控制终端的进程。

               2>创建一个新会话,并将自己的id设置为进程组id和新会话id:setsid

                    pid_t setsid(void)  成功:返回调用进程的会话id  失败:-1

                         

        3)会话的作用:创建守护(daemon精灵)进程

               1>守护进程的定义:linux后台服务进程,通常独立与控制终端并且周期性地执行某种任务或等待处理某些发生的事情,一般采用以d结尾的名字。

               2>守护进程的特点:没有控制终端,不能直接和用户交互,不受用户登录、注销的影响,一直运行着。

               3>创建守护进程的流程:

                                   1》创建子进程,父进程退出,所有工作都在子进程中进行形式上体力子控制终端。

                                   2》在子进程中创建新会话(setsid函数),使子进程完全独立出来,脱离控制。

                                   3》改变当前目录为根目录(chdir函数),防止占用可卸载的文件系统(如挂载在/mnt下的U盘中的程序,就属于可卸载)

                                   4》重设文件权限掩码(umask函数),防止继承的文件创建某些屏蔽字拒绝某些权限,增加守护进程的灵活性。

                                  5》关闭文件描述符,继续的打开文件(0/1/2)不会用到,浪费系统资源,无法卸载,可以重定向到/dev/null文件下。 

                                   6》开始执行守护进程核心工作,守护进程退出处理程序模型。

          4>创建守护进程例子

                    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/382320.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

golang实现聊天室(二)

golang实现聊天室(二) 上一篇完成了服务端启动监听连接,客户端建立连接,发一个消息,断开连接。服务端收一下,然后服务端打印。 客户端可以一直发送消息,服务端不停接收并打印 client func mai…

golang实现聊天室(三)

golang实现聊天室(三) 实现多个客户端同时给服务端发送消息,服务端接受并打印出来 client1 func main() {var conn, err net.DialTimeout("tcp", "127.0.0.1:5888", 30*time.Second)if err ! nil {log.Fatal("conn…

linux操作系统之线程同步及互斥量

(1)线程同步 1)线程同步:指一个线程发出某一个功能运行时,在运行还没有结束的时候,该调用不返回。同时其它线程为保证数据的一致性,不能调用该功能。 2)多个控制流共同操作一个共享资…

golang实现聊天室(四)

golang实现聊天室(四) 服务端给已经建立连接的客户端发送消息 client1 func main() {var conn, err net.DialTimeout("tcp", "127.0.0.1:6888", 30*time.Second)if err ! nil {log.Fatal("conn error")}for {conn.Write…

linux操作系统之读写锁

(1)读写锁:只有一把锁,但是有两种状态(读,写) 1)读写锁的三种状态:读锁,写锁,不加锁 2)读写锁特性(12字)&…

golang实现聊天室(五)

golang实现聊天室(五) 完成服务端广播消息 server package mainimport ("fmt""log""math/rand""net" )type Client_list struct {list map[net.Conn]string }func main() {client_list : Client_list{make(map…

linux操作系统之条件变量

(1)条件变量 条件变量本身不是锁,但它可以造成线程阻塞,通常与互斥锁配合使用。 (2)条件锁相关函数 pthread_cond_t类型,用于定义条件变量 1)初始化一个条件变量:pthrea…

7. 整数反转 golang

官解 func reverse(x int) ( num int) {for x ! 0 {num num*10 x%10x x / 10}// 使用 math 包中定义好的最大最小值if num > math.MaxInt32 || num < math.MinInt32 {return 0}return }Me func reverse(x int) int {if x < 0 {return -1 * reverse_fun(-x)} else…

linux操作系统之信号量、互斥量在进程间的同步、文件锁

&#xff08;1&#xff09;信号量&#xff1a;进化版的互斥量 多个线程间对某个对象的部分数据进行共享&#xff0c;使用互斥锁是没有办法实现的&#xff0c;只能将整个数据对象锁住。这样虽然达到了多线程操作数据共享的目的&#xff0c;却导致线程并发性下降。 信号量&#x…

linux网络编程之网络应用设计模式、分层模型、通信过程

&#xff08;1&#xff09;网络协议 可以理解为规则&#xff0c;其中包含着数据传输和数据的解释。 典型的协议&#xff1a;传输层&#xff1a;tcp/udp协议&#xff0c;应用层&#xff1a;http/ftp协议&#xff0c;网络层&#xff1a;ip协议&#xff0c;网路接口&#xff1a;ar…

680. 验证回文字符串 Ⅱ golang

题目 验证回文字符串 Ⅱ 给定一个非空字符串 s&#xff0c;最多删除一个字符。判断是否能成为回文字符串。 示例 1: 输入: “aba” 输出: True 示例 2: 输入: “abca” 输出: True 解释: 你可以删除c字符。 注意: 字符串只包含从 a-z 的小写字母。字符串的最大长度是50000…

linux网络编程之通信协议格式

好文参考&#xff1a;《网路传输的三张表&#xff1a;MAC地址表&#xff0c;ARP缓存表和路由表》http://www.cnblogs.com/clovn/p/4911212.html &#xff08;1&#xff09;数据包封装 传输层及其一下的机制由内核决定&#xff0c;主要负责通讯的具体细节&#xff1b;应用层由用…

88. 合并两个有序数组 golang

88. 合并两个有序数组 给你两个有序整数数组 nums1 和 nums2&#xff0c;请你将 nums2 合并到 nums1 中&#xff0c;使 nums1 成为一个有序数组。 说明: 初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。 你可以假设 nums1 有足够的空间&#xff08;空间大小大于或等于 m …

linux网络编程之Socket编程

&#xff08;1&#xff09;socket套接字 1&#xff09;在linux环境下&#xff0c;socket用于表示进程间网络通信的特殊文件类型&#xff0c;其本质是内核借助缓冲区形成的伪文件&#xff08;不占磁盘空间&#xff0c;除此之外还有二进制文件&#xff0c;管道&#xff0c;字符文…

Linux操作系统之简易实现server/client

1.首先将出错处理封装成函数&#xff0c;具体封装思想&#xff1a;是在底层函数的基础上将首字母大写&#xff08;方便在编程中查找函数文件的manpage,而不需要使用命令&#xff0c;直接用shiftk&#xff09;,然后调用底层库函数并考虑出错处理&#xff0c;具体函数如下&#x…

75. 颜色分类 golang

https://leetcode-cn.com/problems/sort-colors/solution/75-yan-se-fen-lei-golang-by-hodgekou/ Me func sortColors(nums []int) {sort.Ints(nums) }tips package mainimport ("fmt""sort" )//定义interface{},并实现sort.Interface接口的三个方法 ty…

linux网络编程之TCP三次握手和四次挥手

1.在TCP连接的过程中&#xff0c;有三个阶段&#xff0c;分别是建立连接&#xff0c;传递数据和断开连接&#xff0c;通讯时序图如下所示: 2.结合TCP数据报格式分析建立连接的三次握手 1&#xff09;首先客户端发送一个带有SYN标志的TCP报文给服务器端&#xff0c;询问服务器端…

451. 根据字符出现频率排序golang

官解 func frequencySort(s string) string {charMap : make(map[rune]int)arr : make([]string, len(s))for _,c : range s {charMap[c]}for k,v : range charMap {arr[v - 1] strings.Repeat(string(k), v)}r : ""for _,c : range arr {r c r}return r }自定义排…

linux网路编程之多进程并发服务器

1&#xff09;使用多进程并发服务器考虑的因素&#xff1a; &#xff08;1&#xff09;父进程描述最大文件描述符的个数&#xff08;父进程需要关闭accept返回的新文件描述符&#xff09; &#xff08;2&#xff09;系统内可创建进程的个数&#xff08;与内存大小相关&#xff…

69. x 的平方根 golang

Me https://leetcode-cn.com/problems/sqrtx/submissions/ func mySqrt(x int) int {return int(math.Sqrt(float64(x))) }