进程常用api
fork
该api用于创建子进程,创建出的子进程与父进程共享内存和数据。
pid_t fork(void)
return:在子进程返回0;在父进程中返回子进程的PID;发生错误时返回EOF
例:
pid_t PID = fork();
if (PID < 0) {
perror("fork");
exit(EXIT_FAILURE);
}
else if (PID == 0) {
//子进程
}
else {
//父进程
}
getpid
该api用于查询调用进程的PID
pid_t getpid(void)
return:返回调用进程的PID且不会失败
例:
printf("当前进程的PID为%d\n",getpid());
getppid
该api用于查询调用进程的父进程PID
pid_t getppid(void)
return:返回调用进程的父进程的PID且不会失败
例:
printf("当前进程的PID为%d,父进程PID为%d\n",getpid(),getppid());
sleep
该api用于让整个进程休眠指定时间
unsigned int sleep(unsigned int seconds)
return:如果sleep()正常执行且休眠时间结束,则返回0;如果休眠提前结束,则返回剩余的未休眠秒数
例:
pid_t PID = fork();
if (PID < 0) {
perror("fork");
exit(EXIT_FAILURE);
}
else if (PID == 0) {
sleep(1);
//子进程
}
else {
//父进程
}
//子进程休眠1s,父进程先执行
execve
该api用于从一个进程中跳转到执行另外一个程序
int execve (const char *__path, char *const __argv[], char *const __envp[])
const char *__path:要执行程序的完整路径名
char *const __argv[]:指向字符串数组的指针,需要传入多个参数。1、需要执行的程序(同*__path) 2、执行程序需要传入的参数 3、最后一个参数必须是NULL
char *const __envp[]:指向字符串数组的指针,需要传入多个环境变量参数。1、环境变量参数,固定格式key=value 2、最后一个参数必须是NULL
return:成功会跳转到要执行的程序,失败返回EOF
例:
char *name = "caixukun";
char *path = "/home/atguigu/process_test/erlou";
char *argv[] = {path,name,NULL};
char *envp[] = {NULL};//使用绝对路径不需要传递环境变量
if (execve(argv[0],argv,envp) == EOF) {
perror("execve");
exit(EXIT_FAILURE);
}
waitpid
该api用于等待子进程执行结束
pid_t waitpid(pid_t pid, int *wstatus, int options)
pid_t pid:等待的模式
int *wstatus:整数指针,用于存放等待进程的返回的状态码
int options:额外功能
return:如果成功等到子进程停止,返回PID,失败返回EOF
pid_t pid的等待模式如下:
1、小于-1 例如-1 * pgid,则等待进程组ID等于pgid的所有进程终止
2、等于-1 会等待任何子进程终止,并返回最先终止的子进程的进程ID 儿孙都算
3、等于0 等待同一进程组中任何子进程终止(但不包括组领导进程) 只算儿子
4、大于0 仅等待指定进程ID的子进程返回
options的额外功能如下:
1、WNOHANG 如果没有子进程终止,也立即返回;用于查看子进程状态而非等待
2、WUNTRACED 收到子进程处于收到信号停止的状态,也返回
3、WCONTINUED(自Linux2.6.10起) 如果通过发送SIGCONT信号恢复了一个停止的子进程,则也返回
例:
waitpid(PID,NULL,0);
pipe
该api用于创建匿名管道
int pipe(int pipefd[2])
pipefd:用于返回指向管道两端的文件描述符,pipefd[0]指向管道的读端,pipefd[1]指向管道的写端
return:成功返回0,失败返回EOF
例:
int pipefd[2];
if (pipe(pipefd) == -1)
{
perror("创建管道失败\n");
exit(EXIT_FAILURE);
}
pid_t PID = fork();
if (PID < 0) {
perror("fork");
exit(EXIT_FAILURE);
}
else if(PID == 0) {
//子进程读数据
close(pipefd[1]);
while(read(pipefd[0],&buf,sizeof(buf)) != EOF) {
write(STDOUT_FILENO,&buf,1);
}
close(pipefd[0]);
}
else {
//父进程写数据
close(pipefd[0]);
write(pipefd[1],argv[1],strlen(argv[1]));
close(pipefd[1]);
}
mkfifo
该api用于创建有名管道
int mkfifo(const char *pathname, mode_t mode)
const char *pathname:有名管道绑定的文件路径
mode_t mode:有名管道绑定文件的权限
return:成功返回0,失败返回EOF
例:
char *pipe_path = "/tmp/myfifo";
if (mkfifo(pipe_path,0666) != 0) {
perror("mkfifo");
exit(EXIT_FAILURE);
}
有名管道发送端
int FD = open(pipe_path,O_WRONLY);
char write_buf[100];
ssize_t read_num;
while(read_num = read(STDIN_FILENO,write_buf,100) > 0) {
write(FD,write_buf,read_num);
}
close(FD);
if (unlink(pipe_path) == EOF) {
perror("unlink");
exit(EXIT_FAILURE);
}
有名管道接收端
int FD = open(pipe_path,O_RDONLY);
char read_buf[100];
ssize_t read_num;
while(read_num = read(fd,read_buf,100) > 0) {
write(STDOUT_FILENO,read_buf,read_num);
}
close(FD);
if (unlink(pipe_path) == EOF) {
perror("unlink");
exit(EXIT_FAILURE);
}
//有名管道使用后,应通过unlink调用清除相关资源。
shm_open
该api用于开启一块共享内存对象
int shm_open(const char *name, int oflag, mode_t mode)
const char *name:共享内存对象路径名称
int oflag:打开模式,可二进制拼接
mode_t mode:创建共享内存对象的权限
return:成功返回一个新的文件描述符,失败返回EOF
打开模式如下:
1、O_CREAT:如果不存在则创建新的共享内存对象
2、O_EXCL:当与 O_CREAT 一起使用时,如果共享内存对象已经存在,则返回错误(避免覆盖现有对象)
3、O_RDONLY:以只读方式打开
4、O_RDWR:以读写方式打开
5、O_TRUNC 用于截断现有对象至 0 长度(只有在打开模式中包含 O_RDWR 时 才有效)
例:
char *shm_name = "/letter";
int FD = shm_open(shm_name,O_CREAT | O_RDWR,0666);
if (FD < 0) {
perror("shm_open");
exit(EXIT_FAILURE);
}
shm_unlink
该api用于删除一个先前由shm_open()创建的共享内存对象
int shm_unlink(const char *name)
const char *name:共享内存对象路径名称
return:成功返回0,失败返回EOF
例:
int Result = shm_unlink(shm_name);
if (Result < 0) {
perror("shm_unlink");
exit(EXIT_FAILURE);
}
truncate和ftruncate
truncate 和 ftruncate 都可以将文件缩放到指定大小,二者的行为类似:如果文件被缩小,截断部分的数据丢失,如果文件空间被放大,扩展的部分均为\0 字符。缩放前后文件的偏移量不会更改。缩放成功返回 0,失败返回-1。
int truncate(const char *path, off_t length)
const char *path:要处理文件的路径名称,指定文件存在即可,无需打开
off_t length:指定长度,单位是字节
return:成功返回0,失败返回EOF
int ftruncate(int fd, off_t length)
int fd:文件描述符,需要打开并且有写权限
off_t length:指定长度,单位是字节
return:成功返回0,失败返回EOF
例:
int FD = shm_open(shm_name,O_CREAT | O_WRONLY,0666);
ftruncate(FD,100);
mmap
该api用于将一组设备或文件映射到内存地址
void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset)
void *addr:指向期望映射的内存起始地址的指针,通常设为NULL,让系统选择合适的地址
size_t length:要映射的内存区域的长度,以字节为单位
int prot:内存映射区域保护标志
int flags:映射选项标志
int fd:文件描述符,用于指定要映射的文件或设备
off_t offset:从文件开头的偏移量,映射开始的位置
return:成功时返回映射区域的起始地址,失败返回EOF
int prot的内存映射区域保护标志如下:
1、PROT_READ:允许读取映射区域
2、PROT_WRITE:允许写入映射区域
3、PROT_EXEC:允许执行映射区域
4、PROT_NONE:页面不可访问
int flags映射选项标志如下:
1、MAP_SHARED:映射区域是共享的,对映射区域的修改会影响文件和其他映射到同一区域的进程
2、MAP_PRIVATE:映射区域是私有的,对映射区域的修改不会影响原始文 件,对文件的修改会被暂时保存在一个私有副本中
3、MAP_ANONYMOUS:创建一个匿名映射,不与任何文件关联
4、MAP_FIXED:强制映射到指定的地址,如果不允许映射,将返回错误
例:
share = mmap(NULL, 100, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
mq_open
该api用于创建或打开一个已经存在的消息队列
mqd_t mq_open(const char *name, int oflag, mode_t mode, struct mq_attr *attr);
const char *name:消息队列的名称,必须是以正斜杠"/"开头,以"\0"结尾的字符串,中间可以包含若干字符,但不能有正斜杠
int oflag:指定消息队列的控制权限
mode_t mode:每个消息队列在mqueue文件系统对应一个文件,mode是用来指定消息队列对应的文件权限
struct mq_attr *attr:属性信息,如果为NULL,则队列以默认属性创建
return:成功则返回消息队列描述符,失败返回EOF
int oflag控制权限必须包含以下三种之一:
1、O_RDONLY 打开的消息队列只用于接收消息
2、O_WRONLY 打开的消息队列只用于发送消息
3、O_RDWR 打开的消息队列可以用于收发消息
int oflag可以与以下0至多项或操作之后作为oflag:
1、O_CLOEXEC 设置 close-on-exec 标记,这个标记表示执行 exec 时关闭文件描述符
2、O_CREAT 当文件描述符不存在时创建它,如果指定了这一标记,需要额外提供 mode 和 attr 参数
3、 O_EXCL 创建一个当前进程独占的消息队列,要同时指定 O_CREAT,要求创建的消息 队列不存在,否则将会失败,并提示错误 EEXIST
4、* O_NONBLOCK 以非阻塞模式打开消息队列,如果设置了这个选项,在默认情况下收发 消息发生阻塞时,会转而失败,并提示错误 EAGAIN
例:
char *mq_name = "/mymq";
int mqd = mq_open(mq_name,O_RDWR | O_CREAT,0664,NULL)
mq_timedsend
该api用于发送消息到消息队列中
int mq_timedsend(mqd_t mqdes, const char *msg_ptr, size_t msg_len, unsigned int msg_prio, const struct timespec *abs_timeout)
mqd_t mqdes:消息队列的描述符
const char *msg_ptr:指向消息的指针
size_t msg_len:msg_ptr指向的消息长度,不能超过msg_len属性指定的最大值
unsigned int msg_prio:指定消息的优先级,消息队列中的数据是按照优先级降序排列的
const struct timespec *abs_timeout:指向timespec类型的对象,指定了阻塞等待的最晚时间
return:成功返回0,失败返回EOF
例:
char *send_buf[100];
if(mq_timedsend(mqd,send_buf,strlen(send_buf),0,&time_info) == EOF) {
perror("mq_timedsend");
exit(EXIT_FAILURE);
}
mq_timedreceive
该api用于接收消息队列中的消息
ssize_t mq_timedreceive(mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned int *msg_prio, const struct timespec *abs_timeout)
mqd_t mqdes:消息队列的描述符
char *msg_ptr:接收消息的缓存
size_t msg_len:msg_ptr指向的缓存区的大小,必须大于等于msg_len属性指定的队列单条消息最大字节数
unsigned int *msg_prio:如果不为NULL,则用于接收接收到消息的优先级
const struct timespec *abs_timeout:阻塞等待时的最晚时间节点
return:成功返回接收到的消息的字节数,失败返回EOF
例:
char *read_buf[100];
if (mq_timedreceive(mqd,read_buf,100,NULL,&time_info) == EOF) {
perror("mq_timedreceive");
exit(EXIT_FAILURE);
}
mq_unlink
该api用于消除指定的消息队列
int mq_unlink(const char *name)
const char *name:消息队列名称
return:成功返回0,失败返回EOF
例:
if (mq_unlink(mq_name) == EOF) {
perror("mq_name");
exit(EXIT_FAILURE);
}
clock_gettime
该api用于获取以struct timespec形式表示的clockid指定的时钟
int clock_gettime(clockid_t clockid, struct timespec *tp)
clockid_t clockid:特定时钟的标识符,常用的是CLOCK_REALTIME,表示当前真实时间的时钟
struct timespec *tp:用于接收时间信息的缓存
return:成功返回0,失败返回EOF
例:
struct timespec time_info;
clock_gettime(CLOCK_REALTIME,time_info);
标签:返回,常用,const,EOF,int,char,api,进程
From: https://www.cnblogs.com/alin250017/p/18357437