linux 进程

本文介绍了操作系统中的进程基础知识,包括进程标识符PID、进程的创建(fork)及其区别、进程的结束与资源释放(wait,waitpid)、execl函数族在执行新程序中的作用、用户权限与组权限的管理、system函数的使用、进程会计、进程时间和守护进程的实现,以及通过pipe进行进程间通信。同时提到了syslogd服务在系统日志管理中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

进程基础

1.进程标识符pid

类型pid_t

命令ps axf

进程号是顺次向下使用,并非使用当前最小

pid_t getpid();//返回当前进程号。

 pid_t getppid();//返回当前进程父进程号

2.进程的产生

pid_t fork(void);//复制一个一模一样的进程,进程中到的位置都一样。

fork后父子进程的区别:

fork的返回值不一样,pid不同,ppid也不同,未决信号和文件锁不继承,资源利用率清零

init进程:1号,是所有进程的祖先进程

调度器的调度策略来决定那个进程先运行

fflush的重要性,在fork前刷新,fork出的子进程exit(0)

fork写时拷贝,谁写谁拷贝

3.进程的消亡和释放资源

(收尸)
pid_t wait(int *status);//成功返回终止的子进程的ID号,失败返回-1。等待进程状态改变再进行。

通过宏检测当前进程退出状态

- WIFEXITED(wstatus)正常退出返回true
- WEXITSTATUS(wstatus)在正常退出的基础上返回子进程退出状态码
- WIFSIGNALED(wstatus)子进程由信号终止返回true
- WTERMSIG(wstatus)在信号退出的基础上返回终止进程的信号码
- WIFSTOPPED(wstatus)子进程由信号暂停返回true
- WSTOPSIG(wstatus)在信号暂停基础上返回暂停信号
- WIFCONTINUED(wstatus)检测有没有被信号继续子进程

pid_t waitpid(pid_t pid, int *wstatus, int options);

当pid为0回收同组中任何一个子进程,当pid大于0表示回收对应pid的子进程,pid为-1收回任意子进程,pid小于-1,收回pid绝对值组的任意子进程。

可通过改options,选择阻塞或者非阻塞。

4.exce函数族

用新的进程映像替换当前进程映像

#include <unistd.h>` //exec函数族的头文件

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[]);

5.用户权限及组权限(u+s g+s)

uid_t getuid();返回real uid

uid_t geteuid();返回effective uid

gid_t getgid();返回real gid

gid_t getegid();返回effective gid

int setuid(gid_t uid)设置当前的uid

int setgid(gid_t gid)设置当前的gid

int setreuid(uid_t ruid,uid_t euid);

int setregid(gid_t rgid,gid_t egid);

均为原子操作

6.system()

int system(const char *command);

调用shell实现功能

fork+exec+wait的封装

7.进程会计

进程会计(Process Accounting)是一种操作系统的功能,用于记录和统计系统中运行的进程的资源使用情况和活动情况。

在Linux中,进程会计使用的是acct(Accounting)子系统。acct子系统通过在系统内核中插入一个内核模块来实现进程会计功能,它会监视系统中所有进程的活动,并将它们的活动记录在一个特定的文件中。这个文件通常位于/var/log目录下,文件名为acct。

int accat(const char*acctfile);//打开或关闭系统记账功能

8.进程时间

clock_t times(struct *tms);

9.守护进程

会话session

前台进程和后台进程,琴前台只能存在一个。

终端

pid_t setsid(void);
返回新会话的id,调用setsid的进程会成为新的会话领头进程,并脱离进程组,脱离终端。

pid_t getpgid(pid_t pid);
返回当前进程的进程组id

int setpgid(pid_t pid,pid_t pgid); 
    把指定的进程号放到指定的进程组号中

10.系统日志

syslogd服务

#include<syslog.h>

void openlog(aconst char *ident,int option,intfacility);
关联syslogd服务,

void syslog(int priority,const char*format,...);
进行提交内容priority表示级别,format表示提交格式。

void closelog(void);
关闭与syslogd的连接

11.pipe()

创建一个管道    

int pipe(int pipefd[2]);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值