进程控制(Linux)

发布于:2025-04-18 ⋅ 阅读:(23) ⋅ 点赞:(0)

目录

一.创建进程

1.1 fork函数

​编辑

二. 终止进程

2.1 exit()和_exit()(自己查)

2.1.1进程退出场景

2.2.2进程常见退出方法

三.进程等待

3.1 进程等待的方法

3.1.1 wait方法

3.1.2 waitpid方法

四.进程程序替换

4.1 exec系列


一.创建进程

1.1 fork函数


在linux中fork函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程

#include <unistd.h>
pid_t fork(void);

1.2 fork函数返回值:1.子进程返回0。 2.父进程返回的是子进程的pid。

1.3 调用fork后,OS做的:

1. 分配新的内存块和内核数据结构给子进程
2. 将父进程部分数据结构内容拷贝至子进程
3. 添加子进程到系统进程列表当中
4. fork返回,开始调度器调度

例子:


二. 终止进程

2.1 exit()和_exit()(自己查)

2.1.1进程退出场景

代码运行完毕,结果正确
代码运行完毕,结果不正确
代码异常终止

2.2.2进程常见退出方法

正常终止(可以通过echo $?查看进程退出码):
1.从main返回
2.调用exit()
3._exit()

echo $?比如我执行 ll 指令,成功返回0

三.进程等待

因为可能造成“僵尸进程’的问题,造成内存泄漏。所以需要进程等待

3.1 进程等待的方法

3.1.1 wait方法

#include<sys/types.h>
#include<sys/wait.h>
pid_t wait(int* status);
返回值:成功返回被等待进程pid,失败返回-1。
参数:输出型参数,获取子进程退出状态,不关心则可以设置成为NULL
跟waitpid 那个status一样,下面讲

3.1.2 waitpid方法

pid_ t waitpid(pid_t pid, int *status, int options);
返回值:
    当正常返回的时候waitpid返回收集到的子进程的进程ID;
    如果设置了选项wNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0;
    如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在;
参数:
pid:
    Pid=-1,等待任一个子进程。与wait等效。
    Pid>0.等待其进程ID与pid相等的子进程。

status:输出型参数(下面有例子)

options:
    默认为o,表示阻塞等待(wait 就是为0)
    WNOHANG:若pid指定的子进程没有结束,则waitpid()函数返回o,不予以等待。若正常结束,则返回该子进程的ID。

status 的参数表示模式:

使用如图

四.进程程序替换

4.1调用exec并不创建新进程,所以调用exec前后该进程的id并未改变!!!

4.1exec系列

#include <unistd.h>
int execl(const char *path,  const char *arg, ...);


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


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


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


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


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

用法例子:

注意:执行完execl后,不会再执行原来的代码!!!

    execl("/bin/ls", "ls", "-a", "-l", NULL);

    // 带p的,可以使用环境变量PATH,无需写全路径

    execlp("ls", "ls", "-a", "-l", NULL);

    // 带e的,需要自己组装环境变量

    execle("ls", "ls", "-a", NULL,envp);

    //v就是vector

    execv("/bin/ls", argv);

    // 带p的,可以使用环境变量PATH,无需写全路径

    execvp("ls", argv);

    // 带e的,需要自己组装环境变量

    execve("/bin/ls", argv, envp);


网站公告

今日签到

点亮在社区的每一天
去签到