文章的目的为了记录使用C语言进行linux 开发学习的经历。开发流程和要点有些记忆模糊,赶紧记录,防止忘记。
相关链接:
linux C 语言开发 (一) Window下用gcc编译和gdb调试
linux C 语言开发 (二) VsCode远程开发 linux
linux C 语言开发 (六) 程序的编辑和编译(vim、gcc)
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 |