[08]APUE:进程控制
[a] getpid / getppid / getuid / geteuid / getgid / getegid
#include <unistd.h>
pid_t getpid(void)
pid_t getppid(void)
uid_t getuid(void)
uid_t geteuid(void)
gid_t getgid(void)
gid_t getegid(void)
- 获取当前进程的进程id、父进程id、实际用户id、有效用户id、实际组id、有效组id
[b] fork
#include <unistd.h>
pid_t fork(void) //若成功,子进程返回 0,父进程返回子进程 ID;若出错,返回 -1
- 父子进程的执行没有固定的先后順序,需要手动控制
- 子进程不继承父进程设置的文件锁
- 子进程的未处理闹钟被清除
- 子进程的未处理信号集设置为空集
[c] wait / waitpid
#include <sys/wait.h>
pid_t wait(int *wstatus)
pid_t waitpid(pid_t pid, int *wstatus, int options)
//成功返回进程 ID,出错返回 -1 或 0(非阻塞返回值)
- 子进程终止状态写入 wstatus,可使用 WIFEXITED(wstatus)、WIFSIGNALED(wtatus) 等宏提取子进程的退出状态编号,前者返回非 0 表示正常终止,后者返回非 0 表示异常终止
- 任一子进程终止将使 wait 返回,无子进程终止将阻塞
- waitpid 可用于等待指定 ID 的子进程,options 常用取值为 WNOHNAG ,表示非阻塞,若子进未终止,立即返回,此时返回值为 0
[d] execve / fexecve
#include <unistd.h>
int execve(const char *path, char *const argv[], char *const envp[])
int fexecve(int fd, char *const argv[], char *const envp[])
//成功无返回值,出错返回 -1
- argv 是以 \0 结尾的字符串数组,内含可执行程序的参数,按惯例,首个参数通常设置为程序名称,可设置为其它值如 NULL
- envp 是以 \0 结尾的字符串数组,内含需要指定的环境变量键值对(name=value)
- 其它可用的 exec 类函数有:execl / execlp /execv /execvp,exec*p 类函数只需要可执行文件名称,无须指定绝对路径
[e] setuid / setgid / seteuid / setegid
#include <unistd.h>
int setuid(uid_t uid)
int setgid(gid_t gid)
int seteuid(uid_t uid)
int setegid(gid_t gid)
//成功返回 0,出错返回 -1
- 特权进程将 real-id、effective-id、saved-set-user/grp-id 等三项均设置为参数指定的 ID,非特权进程只设置有效用户ID或有效组ID
- sete*id 函数只设置有效用户ID或有效组ID
[f] system
#include <stdlib.h>
int system(const char *cmdstring)
//成功返回 SHELL 的终止状态,若出错,不同执行阶段有不同的返回值,fork 出错返回 -1,exec* 出错返回 127
- 通常仅用于执行简单的无参数命令,如:date
[g] getlogin
#include <unistd.h>
char *getlogin(void)
//成功返回指向登陆名称的字符串指针,出错返回 NULL
- 鉴于同一个用户 ID 可能存在多个登陆名称(配置不同的 shell),应使用 getlogin 函数提取当前登陆的用户名
[h] nice / getpriority / setpriority
#include <unistd.h>
int nice(int incr) //成功返回新的 nice 值(-NZERO~NZERO -1),出错返回 -1
#include <sys/resource.h>
int getpriority(int which, id_t who) //成功返回 新的 nice 值(-NZERO~NZERO -1),出错返回 -1
int setpriority(int which, id_t who, int value) //成功返回 0,出错返回 -1
- nice 只作用调用进程本身,不能更改其它进程的 nice 值,返回的新 nice 值是参数 incr 与 原 nice 值之和,若新值超过上限或下限,则自动设置为 -NZERO 或 NZERO
- setpriority 可修改其它进程的 nice 值,which 参数可选的值有 PRIO_PROCESS / PRIO_PGRP / PRIO_USER,who 参数的含义由 which 参数决定;若 who 为 0,则使用调用进程自身的信息;value 参数与原 nice 值之和即新 nice 的值
[i] times
#include <sys/times.h>
clock_t times(struct tms *tp) //成功返回 Wall time(以 cpu tick 为单位),出错返回 -1
struct tms {
clock_t tms_utime; //用户 CPU 时间
clock_t tms_stime; //系统 CPU 时间
clock_t tms_cutime; //包含调用进程及其 wait 子进程所消耗的用户 CPU 时间
clock_t tms_cstime; //包含调用进程及其 wait 子进程所消耗的系统 CPU 时间
}
- 进程开始及结束时各运行一次,取函数返回值及 tms 结构体内各项的时间差
- 需要使用 sysconf(_SC_CLK_TCK) 的返回值,将结果转换成以秒为单位
- 类似函数:getrusage
[08]APUE:进程控制的更多相关文章
- 【APUE | 08】进程控制
函数fork 博文链接: 1. 代码示例: #include "apue.h" ; char buf[] = "a write to stdout\n"; in ...
- [APUE]进程控制(上)
一.进程标识 进程ID 0是调度进程,常常被称为交换进程(swapper).该进程并不执行任何磁盘上的程序--它是内核的一部分,因此也被称为系统进程.进程ID 1是init进程,在自举(bootstr ...
- [APUE]进程控制(中)
一.wait和waitpid函数 当一个进程正常或异常终止时会向父进程发送SIGCHLD信号.对于这种信号系统默认会忽略.调用wait/waidpid的进程可能会: 阻塞(如果其子进程都还在运行); ...
- [APUE] 进程控制
APUE 一书的第八章学习笔记. 进程标识 大家都知道使用 PID 来标识的. 系统中的一些特殊进程: PID = 0: 调度进程,也称为交换进程 (Swapper) PID = 1: init 进程 ...
- [APUE]进程控制(下)
一.更改用户ID和组ID 可以用setuid设置实际用户ID和有效用户ID.可以用setgid函数设置实际组ID和有效组ID. #include <sys/types.h> #includ ...
- (六) 一起学 Unix 环境高级编程 (APUE) 之 进程控制
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- APUE(8)---进程控制(1)
一.进程标识 每个进程都有一个非负整型标识的唯一进程ID.因为进程ID标识符总是唯一的,常将其用做其他标识符的一部分以保证其唯一性.进程ID虽然是唯一的, 但是却是可以复用的.ID为0的进程通常是调度 ...
- 进程控制(Note for apue and csapp)
1. Introduction We now turn to the process control provided by the UNIX System. This includes the cr ...
- apue学习笔记(第八章 进程控制)
本章介绍UNIX系统的进程控制,包括创建新进程.执行程序和进程终止. 进程标识 每一个进程都有一个非负整数表示的唯一进程ID,除了进程ID,每个进程还有一些其他标识符.下列函数返回这些标识符 #inc ...
- 《UNIX环境高级编程》(APUE) 笔记第八章 - 进程控制
8 - 进程控制 Github 地址 1. 进程标识 每个进程都有一个非负整型表示的 唯一进程 ID .进程 ID 是可复用的(延迟复用算法). ID 为 \(0\) 的进程通常是调度进程,常常被称为 ...
随机推荐
- golang 前置补0
package main import ( "fmt" ) func main() { a := 1 fmt.Println(a) //前置补0 fmt.Printf(" ...
- Spark Streaming消费Kafka Direct方式数据零丢失实现
使用场景 Spark Streaming实时消费kafka数据的时候,程序停止或者Kafka节点挂掉会导致数据丢失,Spark Streaming也没有设置CheckPoint(据说比较鸡肋,虽然可以 ...
- MSSQL日志传送出现“LSN 太晚,无法应用到数据库”
一个月之前配置了日志传送的数据库,在今天早上收到作业警报:"LSRestore_ServerName_Databasename"运行失败,到历史记录中查看,错误信息如下 消息 20 ...
- 基于angular写的一个todolist
对于新手来说,使用angularjs写一个todolist可以快速入门
- Lucene 工作原理 之倒排索引
1.简介 倒排索引源于实际应用中需要根据属性的值来查找记录.这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址.由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排 ...
- Sql Server中不常用的表运算符之APPLY(1)
写在这个系列的前面: 就像他们的名字一样,作为一个表运算,他们用来运算左表和右表.JOIN也是一个表运算符,不过他太常用了. APPLY: 将右表表达式应用在左表的每一行上. APPLY是Sql200 ...
- sqllite
public static void tt() { int ID = 0; while(true) { stri ...
- 循序渐进Python3(八) -- 1 -- socket进阶
IO多路复用 I/O多路复用指:通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作. Linux中的 select,poll,epoll 都 ...
- ICMP Protocol
[ICMP Protocol] 参考: 1.ICMP Types and Codes:http://www.nthelp.com/icmp.html 2.RFC 792 - Internet Cont ...
- Java 对文件的读取操作
package pack; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; ...