进程概述和ps管理进程

什么是进程:

在这里插入图片描述
下图所示是进程的生命周期:
在这里插入图片描述
在这里插入图片描述
简单理解:父进程退出了子进程没有退出,那么这些子进程就没有父进程来管理了,就变成僵尸进程。

进程的属性:

在这里插入图片描述
使用ps查看进程工具:

在这里插入图片描述
例2:常用的选项组合是 ps -aux

[root@docker abc]# ps -aux | head 
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.2 125352  3888 ?        Ss   13:33   0:00 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root           2  0.0  0.0      0     0 ?        S    13:33   0:00 [kthreadd]
root           4  0.0  0.0      0     0 ?        S<   13:33   0:00 [kworker/0:0H]
root           6  0.0  0.0      0     0 ?        S    13:33   0:00 [ksoftirqd/0]
root           7  0.0  0.0      0     0 ?        S    13:33   0:00 [migration/0]
root           8  0.0  0.0      0     0 ?        S    13:33   0:00 [rcu_bh]
root           9  0.0  0.0      0     0 ?        R    13:33   0:00 [rcu_sched]
root          10  0.0  0.0      0     0 ?        S<   13:33   0:00 [lru-add-drain]
root          11  0.0  0.0      0     0 ?        S    13:33   0:00 [watchdog/0]

注:最后一列 [xxxxx] 使用方括号括起来的进程是内核态的进程。没有括起来的是用户态的进程。

上面的参数输出每列含义:
在这里插入图片描述
5个基本状态后,还可以加一些字母,比如:Ss、R+。如下图
在这里插入图片描述

在这里插入图片描述
例1:查看进程状态

编辑a.txt:
[root@docker abc]# vim a.txt
在另一个终端执行:
[root@docker abc]# ps -aux | grep a.txt  #查看状态, S表示睡眠状态
root        2065  0.0  0.2 149448  5128 pts/0    S+   15:55   0:00 vim a.txt
root        2073  0.0  0.0 112728   984 pts/1    S+   15:56   0:00 grep --color=auto a.txt

在vim a.txt这个终端上 按下 :ctrl+z
[1]+  已停止               vim a.txt

在另个终端执行:
[root@docker abc]# ps -aux | grep a.txt  #查看状态,S表示停止状态
root        2065  0.0  0.2 149448  5128 pts/0    T    15:55   0:00 vim a.txt
root        2089  0.0  0.0 112728   984 pts/1    R+   16:04   0:00 grep --color=auto a.txt

在这里插入图片描述
例2:D 不可中断状态
[root@docker abc]# tar -zcvf a.tar.gz /usr/

#然后在另一个终端不断查看状态,由S+,R+变成D+

[root@docker abc]# ps -aux | grep tar
root        1109  0.0  0.0      0     0 ?        S<   13:33   0:00 [target_completi]
root        2104  0.0  0.0 112728   972 pts/0    R+   16:17   0:00 grep --color=auto tar
[root@docker abc]# ps -aux | grep tar
root        1109  0.0  0.0      0     0 ?        S<   13:33   0:00 [target_completi]
root        2105  1.6  0.0 123576  1468 pts/1    S+   16:17   0:00 tar -zcvf a.tar.gz /usr/
root        2108  0.0  0.0 112728   972 pts/0    R+   16:18   0:00 grep --color=auto tar
[root@docker abc]# ps -aux | grep tar
root        1109  0.0  0.0      0     0 ?        S<   13:33   0:00 [target_completi]
root        2105  1.6  0.0 123576  1468 pts/1    D+   16:17   0:00 tar -zcvf a.tar.gz /usr/

ps常用的参数 :ps -ef

[root@docker abc]# ps -ef | grep tar
root        1109       2  0 13:33 ?        00:00:00 [target_completi]
root        2116    1606  0 16:22 pts/0    00:00:00 grep --color=auto tar
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
进程通信 Linux进程间通信 一、进程间通信概述 进程通信有如下一些目的: A、数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间 B、共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。 C、通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。 D、资源共享:多个进程之间共享同样的资源。为了作到这一点,需要内核提供锁和同步机制。 E、进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。 Linux 进程间通信(IPC)以下以几部分发展而来: 早期UNIX进程间通信、基于System V进程间通信、基于Socket进程间通信和POSIX进程间通信。 UNIX进程间通信方式包括:管道、FIFO、信号。 System V进程间通信方式包括:System V消息队列、System V信号灯、System V共享内存、 POSIX进程间通信包括:posix消息队列、posix信号灯、posix共享内存。 现在linux使用的进程间通信方式: (1)管道(pipe)和有名管道(FIFO) (2)信号(signal) (3)消息队列 (4)共享内存 (5)信号量 (6)套接字(socket) 二、管道通信 普通的Linux shell都允许重定向,而重定向使用的就是管道。例如: ps | grep vsftpd .管道是单向的、先进先出的、无结构的、固定大小的字节流,它把一个进程的标准输出和另一个进程的标准输入连接在一起。写进程在管道的尾端写入数据,读进程在管道的道端读出数据。数据读出后将从管道中移走,其它读进程都不能再读到这些数据。管道提供了简单的流控制机制。进程试图读空管道时,在有数据写入管道前,进程将一直阻塞。同样,管道已经满时,进程再试图写管道,在其它进程从管道中移走数据之前,写进程将一直阻塞。管道主要用于不同进程间通信。 管道创建与关闭 创建一个简单的管道,可以使用系统调用pipe()。它接受一个参数,也就是一个包括两个整数的数组。如果系统调用成功,此数组将包括管道使用的两个文件描述符。创建一个管道之后,一般情况下进程将产生一个新的进程。 系统调用:pipe(); 原型:int pipe(int fd[2]); 返回值:如果系统调用成功,返回0。如果系统调用失败返回-1: errno=EMFILE(没有空亲的文件描述符) EMFILE(系统文件表已满) EFAULT(fd数组无效) 注意:fd[0]用于读取管道,fd[1]用于写入管道。 图见附件 管道的创建 #include<unistd.h> #include<errno.h> #include<stdio.h> #include<stdlib.h> int main() { int pipe_fd[2]; if(pipe(pipe_fd)<0){ printf("pipe create error\n"); return -1; } else printf("pipe create success\n"); close(pipe_fd[0]); close(pipe_fd[1]); } 管道的读写 管道主要用于不同进程间通信。实际上,通常先创建一个管道,再通过fork函数创建一个子进程。图见附件。 子进程写入和父进程读的命名管道:图见附件 管道读写注意事项: 可以通过打开两个管道来创建一个双向的管道。但需要在子理程中正确地设置文件描述符。必须在系统调用fork()中调用pipe(),否则子进程不会继承文件描述符。当使用半双工管道时,任何关联的进程都必须共享一个相关的祖先进程。因为管道存在于系统内核之中,所以任何不在创建管道的进程的祖先进程之中的进程都将无法寻址它。而在命名管道中却不是这样。管道实例见:pipe_rw.c #include<unistd.h> #include<memory.h> #include<errno.h> #include<stdio.h> #include<stdlib.h> int main() { int pipe_fd[2]; pid_t pid; char buf_r[100]; char* p_wbuf; int r_num; memset(buf_r,0,sizeof(buf_r));数组中的数据清0; if(pipe(pipe_fd)<0){ printf("pipe create error\n"); return -1; } if((pid=fork())==0){ printf("\n"); close(pipe_fd[1]); sleep(2); if((r_num=read(pipe_fd[0],buf_r,100))>0){ printf("%d numbers read from be pipe is %s\n",r_num,buf_r); } close(pipe_fd[0]); exit(0); }else if(pid>0){ close(pipe_fd[0]); if(write(pipe_fd[1],"Hello",5)!=-1) printf("parent write success!\n"); if(write(pipe_fd[1]," Pipe",5)!=-1) printf("parent wirte2 succes!\n"); close(pipe_fd[1]); sleep(3); waitpid(pid,NULL,0); exit(0); } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值