linux C 语言开发 (八) 进程基础

   文章的目的为了记录使用C语言进行linux 开发学习的经历。开发流程和要点有些记忆模糊,赶紧记录,防止忘记。

  相关链接:

linux C 语言开发 (一) Window下用gcc编译和gdb调试

linux C 语言开发 (二) VsCode远程开发 linux

linux C 语言开发 (三) 建立云服务器

linux C 语言开发 (四) linux系统常用命令

linux C 语言开发 (五) linux系统目录结构

linux C 语言开发 (六) 程序的编辑和编译(vim、gcc)

linux C 语言开发 (七) 文件 IO 和标准 IO

linux C 语言开发 (八) 进程基础

Linux C到Android App开发推荐链接(入门十二章):

开源 java android app 开发(一)开发环境的搭建_csdn 开源 java android app-CSDN博客

开源 java android app 开发(一)开发环境的搭建-CSDN博客

开源 java android app 开发(二)工程文件结构-CSDN博客

开源 java android app 开发(三)GUI界面布局和常用组件-CSDN博客

开源 java android app 开发(四)GUI界面重要组件-CSDN博客

开源 java android app 开发(五)文件和数据库存储-CSDN博客

开源 java android app 开发(六)多媒体使用-CSDN博客

开源 java android app 开发(七)通讯之Tcp和Http-CSDN博客

开源 java android app 开发(八)通讯之Mqtt和Ble-CSDN博客

开源 java android app 开发(九)后台之线程和服务-CSDN博客

开源 java android app 开发(十)广播机制-CSDN博客

开源 java android app 开发(十一)调试、发布-CSDN博客

开源 java android app 开发(十二)封库.aar-CSDN博客

linux C到.net mvc开发推荐链接:

开源C# .net mvc 开发(一)WEB搭建_c#部署web程序-CSDN博客

开源 C# .net mvc 开发(二)网站快速搭建_c#网站开发-CSDN博客

开源 C# .net mvc 开发(三)WEB内外网访问(VS发布、IIS配置网站、花生壳外网穿刺访问)_c# mvc 域名下不可訪問內網,內網下可以訪問域名-CSDN博客

开源 C# .net mvc 开发(四)工程结构、页面提交以及显示_c#工程结构-CSDN博客

开源 C# .net mvc 开发(五)常用代码快速开发_c# mvc开发-CSDN博客

内容:讲述进程的基础知识,进程就是正在运行的程序。讲述如何创建,运行种类等。

目录:

1.创建

2.执行

3.命令

4.种类

一、创建

        所有的进程都是由其他进程创建(除了 pid 为 0 号的 idle 进程) , pid 号为 1 的 init 进程是系统启动后运行的第一个进程, 是所有进程的父进程, init 进程会初始化一部分系统服务, 创建其他进程。

        创建新进程的那个进程称为父进程, 新进程称为子进程, 父进程和子进程拥有相同的代码段数据段,有各自独立的地址空间。 采用写时拷贝技术, 即创建的新进程不会立即把父进程的资源空间复制过来, 只有在修改时才会复制资源, 另外父进程挂起的信号和文件锁不会被子进程继承。

        子进程结束后, 它的父进程要回收它的资源, 否则就会成为僵尸进程 。

        如果父进程先结束, 子进程会被 init 进程收养, 称为孤儿进程

头文件#include <sys/types.h> #include <unistd.h>
函数pid_t getpid(void);
返回值PID 号
功能获取此进程 PID

头文件#include <sys/types.h> #include <unistd.h>
函数pid_t getppid(void);
返回值PID 号
功能获取父进程 PID

头文件#include <unistd.h>
函数pid_t fork(void);
返回值调用成功父进程返回子进程号, 子进程返回 0, 失败返回-1。
功能系统调用, 创建一个进程

#include <stdio.h>
#include <unistd.h>
int main(void)
{
pid_t pid;
pid = fork();
if (pid < 0)
{
printf("fork is error \n");
return -1;
} 
//父进程
if (pid > 0)
{
printf("This is parent,parent pid is %d\n", getpid());
} 
//子进程
if (pid == 0)
{
printf("This is child,child pid is %d,parent pid is %d\n", getpid(), get
ppid());
} 
return 0;
}

执行后的效果

二、执行

用 fork 函数创建子进程后, 子进程往往要调用一种 exec 函数以执行另一个程序, 该子进程被新的程序替换, 改变地址空间, 进程映像和一些属性, 但是 pid 号不变。

函数int execve(const char *filename, char *const argv[], char *const envp[]);
头文件#include <unistd.h>
参数 filename路径名, 表示载入进程空间的新程序路径。
参数 argv[]命令行参数, argv[0]为命令名
参数 envp[]新程序的环境变量
返回值成功时不会返回, 使用时不用检查返回值, 可通过 errno 检查。

以下函数都是根据 execve 实现:

int execl(const char *path, const char *arg, .../* (char *) NULL */);

int execlp(const char *file, const char *arg, .../* (char *) NULL */);

int execle(const char *path, const char *arg, .../*, (char *) NULL, char * const envp[] */);

int execv(const char *path, char *const argv[]);

int execvp(const char *file, char *const argv[]);

int execvpe(const char *file, char *const argv[],char *const envp[]);

演示代码

执行execl,创建execl_sub

execl代码

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(void)
{
int i=0;
pid_t pid;
pid = fork();
if (pid < 0)
{
printf("fork is error \n");
return -1;
} /
/父进程
if (pid > 0)
{
printf("This is parent,parent pid is %d\n", getpid());
} /
/子进程
if (pid == 0)
{
printf("This is child,child pid is %d\n", getpid(), getppid());
//改为自己的路径
execl("/home/samba/linux/15/hello","hello",NULL);
exit(1);
} i
++;
printf("i is %d\n",i);
return 0;
}

execl_sub代码

#include <stdio.h>
#include <unistd.h>
int main(void)
{
printf("hello world\n");
return 0;
}

演示效果

三、命令

进程常用命令为ps和kill

ps 命令: ps 命令可以列出系统中当前运行的那些进程。

命令格式: ps [参数]

命令功能: 用来显示当前进程的状态常用参数: aux

kill 命令: kill 命令用来杀死进程举例: kill -9(SIGKILL) PID

进程的状态

D: 无法中断的休眠状态 (通常 IO 的进程)
R: 正在执行中
S: 静止状态
T: 暂停执行
Z: 不存在但暂时无法消除
W: 没有足够的记忆体分页可分配
<: 高优先序的行程
N: 低优先序的行程
L: 有记忆体分页分配并锁在记忆体内 (实时系统或捱 A I/O)

显示所有进程

ps -aux

查找进程

ps aux | grep test

杀死进程

kill -9(SIGKILL) PID

四、种类

孤儿进程: 父进程结束以后, 子进程还未结束, 这个子进程就叫做孤儿进程。

僵尸进程: 子进程结束以后, 父进程还在运行, 但是父进程不去释放进程控制块, 这个子进程就叫做僵尸进程。

守护进程(daemon)是一类在后台运行的特殊进程, 用于执行特定的系统任务。 很多守护进程在系统引导的时候启动, 并且一直运行直到系统关闭。 另一些只在需要的时候才启动, 完成任务后就自动结束
 

要防止僵尸进程可以使用wait函数

wait()函数一般用在父进程中等待回收子进程的资源, 而防止僵尸进程的产生

函数pid_t wait(int *status)
头文件#include <sys/wait.h>
返回值成功返回回收的子进程的 pid, 失败返回-1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值