进程基础
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]);