Linux进程学习

进程与进程管理

清屏:system("clear");  //#include <signal.h>

系统调用:

write(文件描述符,字符串,字符串大小)。read(文件描述符,字符串,字符串大小),读取文件中前‘字符串大小‘的内容,并保存到字符串中(而且只要open不更改打开模式,默认情况会在文件内容为空时,阻塞进程);成功则返回读到的字符串大小(0-‘字符串大小‘),否则返回-1。

open(文件名,打开模式),返回文件描述符。close(文件描述符),关闭用open打开的文件,所以参数文件描述符为open返回过的。

进程环境与进程属性:

什么是进程:简单的说,进程就是程序的一次执行过程。

进程的状态:进程三态:运行态、就绪态、封锁态——状态可在一定的条件下变化。(其中处于等待的进程分为:可中断进程可以被信号中断其等待;不可中断进程在任何情况下都不可被中断,一直等待条件的满足)。僵死进程:子进程先于父进程退出;从子进程终止到父进程调用wait()之前的时间段内,子进程被称为僵死进程zombie(因为只有父进程能回收,而父进程没有回收其资源)/ 孤儿进程:父进程先于子进程退出,子进程被称为孤儿进程(被进程0/init进程?回收)

进程的执行模式与类型:执行模式分为用户模式—中断/系统调用—>内核模式。进程类型分为用户进程—中断/系统调用—>系统进程。

进程的属性:查看进程的属性:非实时ps aux/auxf、实时top。每一列的含义(有空再看)。会话(进程组的集合):一个会话可以没有控制终端,也可以与一个终端建立连接,建立连接的会话首进程称为控制进程;一个会话可以有几个进程组,可分为一个前台进程组(当会话带有一个终端)和多个后台进程组。其特点:无论何时在终端输入中断信号(ctrl+c)或终端的退出键,就会有中断信号或退出信号发送给前台进程组的所有进程。

获取/设置进程组号(PGID):getpgid(pid) / int setpgid(pid, pgid)、获取进程的会话号:getsid(sid) ;创建会话:pid_t setsid()返回进程号,该进程作为会话首进程。控制终端函数:pid_t tcgetpgrp(int filedes)、pid_t tcsetpgrp(int filedes, pid_t pgrpid)、pid_t tcgetsid(int filedes)(有空再看)。

进程用户属性:

真实用户号(RUID)、有效用户号(EUID)、进程用户号(GID)、有效进程用户组号(EGID):有空再看。

进程的管理:

创建进程:pid_t fork();执行成功后,如果父进程抢到了执行权,则返回子进程的PID,如果子进程抢到了执行权,则返回0,否则执行失败,返回-1;这个函数是系统调用,对父进程复制,所以子进程几乎与父进程一样,代码相同,对文件采用共享方式,但是数据和文件描述符采用独占方式。/   vfork()函数与父进程共享数据空间,这种方式执行效率较高,执行顺序是子先父后。

退出进程:

on_exit(test_exit, (void *)str);该函数有两个参数,第一个是:进程结束前,调用的test_exit函数,如void test_exit(int status, void *arg){...},test_exit函数的第一个参数必须是进程结束时exit(status)的status;第二个(应该不止示例中的参数)的参数就是:传递给test_exit函数的arg,的str。

进程的正常结束void exit(int status):进程的缓冲区数据自动写回、关闭未关闭的文件。#include <stdlib.h>

void _exit(int status):进程的缓冲区数据不会自动写回、不会自动关闭文件。#include <unistd.h>

等待进程(等待子进程中断或结束):pid_t wait(int *status);停止当前进程的执行,直到有信号到来或者其子进程结束。如果子进程已结束,执行wait时会立即返回子进程id和结束状态(保存在参数status中)。status也可以不写,还有一些测试宏(#include <stdlib.h>)。有错误(没有子进程)则返回-1。一发现终止的子进程,就根据其pid释放子进程占用的task_struct和系统空间堆栈(就是资源),然后把该子进程的CPU使用时间加到其父进程上。

替换当前进程:#include <unistd.h>

int execl(const char *path, const char *arg, ...)、int execlp(const *file, const char *arg, ...)、int execv(const char *path, const char *argv[])、int execvp(const char *file, const char *argv[])、execve(const char *filename, const char *argv[], const char *envp[])

进程的调度算法(暂时不管)。

进程间通信

一些基本概念:

进程同步:一个功能未完成,就不返回(一件事做完,才做下一件)
进程异步:各做各的,每当有一件事做完后就通知调用者。
IPC:进程间通信。每个IPC机制都有唯一ID,通过KEY创建。
三种继承自System V的IPC机制:信号量、消息队列、共享内存。

同主机,进程间异步机制:信号(signal)

信号安装:

signal(信号,函数)——>函数可以不带参数,也可以带一个参数(参数为信号,信号就是一堆int值)。

sigaction(信号,信号结构体,信号结构体)。——>第二个参数安装现在的信号(如果为空指针,则保持原来的信号不变),第三个为之前的信号结构体。

信号结构体:1、.sa_handler信号处理函数。2、.sa_mask信号处理函数执行过程中,阻塞掉的其他信号。3、.sa_flags用于更改指定信号的行为。

同主机,进程间同步机制:信号量(semaphore)

同主机,进程间数据交互机制:无名管道(PIPE)、有名管道(FIFO)、消息队列、内存映射、共享内存,管道和消息队列都自带同步机制,内存映射、共享内存则无同步。

管道的创建都不用头文件。

无名管道PIPE:每个管道只有一个内存页面做环形缓冲区,用两个管道可以实现全双工。
管道的创建:int pipe(int files[2]);参数为文件描述符,0为读,1为写;成功返回0,否则-1;写入的数据被读出就消失。然后就可以通过两个文件描述符files[0]、files[1]进行进程间的数据交互。

命名管道可保存为文件系统中,的特殊的设备文件,所以进程随时都可以通过命名管道进行I/O操作。
命名管道创建:通过命令:mkfifo fileName(还可以通过命令使用、删除FIFO);系统调用:int mkfifo(文件名, 管道文件权限),成功则返回文件描述符,否则返回-1。

网络中,主机间数据交互机制:套接字(socket)

时间: 2024-10-06 07:46:16

Linux进程学习的相关文章

Linux 进程学习

------------------------------------------------------------------------------------------- ps 显示瞬间进程的状态,并不动态连续,如果想对进程进行时间控制,应该用top     -A 列出所有的行程  -w 显示加宽可以显示较多的资讯  -au 显示较详细的资讯  -aux 显示所有包含其他使用者的进程 #平时用的比较多的是 ps axu  # -e 显示所有进程 -f 显示所有进程的所有信息 -r 只

Linux进程学习(孤儿进程和守护进程)

孤儿进程和守护进程 通过前面的学习我们了解了如何通过fork()函数和vfork()函数来创建一个进程.现在 我们继续深入来学习两个特殊的进程:孤儿进程和守护进程 一.孤儿进程 1.什么是 孤儿进程如果一个子进程的父进程先于子进程 结束, 子进程就成为一个孤儿进程,它由 init 进程收养,成为 init 进程的子进程.2.那么如何让一个进程变为一个孤儿进程呢?我们可以先创建一个进程,然后杀死其父进程,则其就变成了孤儿进程.pid =  fork();if(pid > 0) {         

Linux进程学习 - 孤儿进程和守护进程

孤儿进程和守护进程 通过前面的学习我们了解了如何通过fork()函数和vfork()函数来创建一个进程.现在 我们继续深入来学习两个特殊的进程:孤儿进程和守护进程 一.孤儿进程 1.什么是 孤儿进程如果一个子进程的父进程先于子进程 结束, 子进程就成为一个孤儿进程,它由 init 进程收养,成为 init 进程的子进程.2.那么如何让一个进程变为一个孤儿进程呢?我们可以先创建一个进程,然后杀死其父进程,则其就变成了孤儿进程.pid =  fork();if(pid > 0) {         

linux 进程学习笔记-进程跟踪

<!--[if !supportLists]-->Ÿ <!--[endif]-->进程跟踪 long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data); Linux用ptrace来进行进程跟踪,就跟我们平时用GDB debug一样,它允许一个进程去跟踪和控制另外一个进程.当被跟踪进程有信号发生时,被跟踪进程会被暂停下来,其内存空间变得可读写,跟踪它的进程可以选择是否忽略该信号和让程序继续

linux 进程学习笔记-共享内存

如果能划定一块物理内存,让多个进程都能将该内存映射到其自身虚拟内存空间的话,那么进程可以通过向这块内存空间读写数据而达到通信的目的.另外,和消息队列不同的是,共享的内存在用户空间而不是核空间,那么就不存在“用户空间和内核空间之间数据复制”的问题,这会减少不少开销. 由于不同进程都可能向同一个空间读写数据,所以其需要一些同步机制来防止混乱,可以使用的机制有“信号量”“文件锁”等. 共享内存有mmap和System V Shared Memory, 下面说的是后者. 创建或打开共享内存: int s

linux 进程学习笔记-等待子进程结束

<!--[if !supportLists]-->Ÿ <!--[endif]-->等待子进程结束 pid_t waitpid(pid_t pid, int *stat_loc, int options) 另外有一个函数叫wait,其相当于 waitpid(-1, &status, 0) 大家经常看到的关于waitpid的经典例子是:你下载了某个软件的安装程序A,其在安装即将结束时启动了另外一个流氓软件的安装程序B,当B也安装结束后,其告诉你所有安装成功了.A和B分别在不同的

Linux 程序设计学习笔记----进程管理与程序开发(下)

转载请注明出处:http://blog.csdn.net/suool/article/details/38419983,谢谢! 进程管理及其控制 创建进程 fork()函数 函数说明具体参见:http://pubs.opengroup.org/onlinepubs/009695399/functions/fork.html 返回值:Upon successful completion, fork() shall return 0 to the child process and shall re

Linux内核学习-进程

先说几个术语: 一.Linux进程的五个段 下面我们来简单归纳一下进程对应的内存空间中所包含的5种不同的数据区都是干什么的.重点:代码段.数据段.堆栈段,这是一个概念堆.栈.全局区.常量区,这是另一个概念1)代码段:代码段是用来存放可执行文件的操作指令,也就是说是它是可执行程序在内存中的镜像.代码段需要防止在运行时被非法修改,所以只准许读取操作,而不允许写入(修改)操作--它是不可写的.代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域.这部分

linux内核学习:进程管理

进程状态 TASK_RUNNING 可运行或正在运行 TASK_INTERRUPTIBLE 进程被阻塞,但可以被信号唤醒 TASK_UNINTERRUPTIBLE 进程被阻塞,且不可以被信号唤醒 TASK_STOPPED 进程已停止,且不能再投入运行 TASK_ZOMBIE 所谓的僵死进程,进程描述符仍然保留 关键函数和结构 task_struct thread_info current clone fork exec wait exit linux内核学习:进程管理,布布扣,bubuko.co