函数说明

一、getpid——取得进程识别码
二、getppid——取得父进程的进程识别码
三、exit——正常结束进程
四、wait——等待子进程中断或结束
五、fork——建立一个新子进程
六、vfork——建立一个新的子进程
七、execl——执行文件
八、execv——执行文件
九、system——执行shell 命令
十、popen——建立管道I/O

相关指令

ps —— 查看系统中有哪些进程
ps -aux —— 查看系统中全部进程
ps -aux|grep A —— 查找A进程
top —— 任务管理器界面

一、getpid——取得进程识别码

1.原函数

表头文件
#include "unistd.h"
定义函数
pid_t getpid(void);

函数说明——getpid()用来取得目前进程的进程识别码,许多程序利用取到的此值来建立临时文件,以避免临时文件相同带来的问题。
返回值——目前进程的进程识别码

2.示例

#include "unistd.h"
#include "stdio.h"int main(int argc, char const *argv[])
{printf("pid=%d\n", getpid());return 0;
}

运行结果:结果仅供参考
pid=17694

二、getppid——取得父进程的进程识别码

1.原函数

表头文件
#include "unistd.h"
定义函数
pid_t getppid(void);

函数说明——用来取得目前进程的父进程识别码
返回值——目前进程的父进程识别码

2.示例

#include "unistd.h"
#include "stdio.h"int main(int argc, char const *argv[])
{printf("My parent id=%d\n", getppid());return 0;
}

运行结果:My parent id=17800

三、exit——正常结束进程

1.原函数

表头文件
#include "stdlib.h"
定义函数
void exit(int status);

函数说明——exit()用来正常终结目前进程的执行,并把参数status返回给父进程,而该进程所有的缓冲区数据会自动写回并关闭未关闭的文件
status——返回给父进程的参数
返回值——无

四、wait——等待子进程中断或结束

1.原函数

表头文件
#include "sys/types.h"
#include "sys/wait.h"
定义函数
pid_t wait (int *status);

函数说明——wait()会暂时停止目前进程的执行,直到有信号来到或子进程结束
status——子进程的结束状态值(exit里面这个值)
返回值——成功则返回子进程识别码(PID)。错误返回-1,错误原因存于errno中

五、fork——建立一个新子进程

1.原函数

表头文件
#include <sys/types.h>
#include <unistd.h>
定义函数
pid_t fork(void);

函数说明——在父进程将fork() 后续代码拷贝一份给子进程,两进程的数据不互相影响并且同时运行
返回值——为0 代表当前进程为子进程。非负数代表当前进程为父进程。-1 —— 调用失败

2.示例

#include <stdio.h>
#include <stdlib.h>
#include "unistd.h"
#include "sys/types.h"
#include "sys/wait.h"int main()
{pid_t id=fork();//建立子进程if(id>0)//父进程可进入执行的代码{wait(NULL);//等待子进程退出printf("father,id=%d\n",getpid());}if(id==0)//子进程可进入执行的代码{printf("son,id=%d\n",getpid());exit(1);//正常退出}printf("OK\n");return 0;
}

运行结果
father,id=55877
OK
son,id=55878
OK

六、vfork——建立一个新的子进程

1.原函数

表头文件
#include "unistd.h"
定义函数
pid_t vfork(void);

函数说明——vfork()会产生一个新的子进程,直接使用父进程存储空间,不拷贝,同时保证子进程运行并退出后,父进程执行
返回值——vfork()成功则在父进程会返回新建立的子进程代码(PID),而在新建立的子进程中则返回0。如果vfork失败则直接返回-1,失败原因存于errno中
另外纤细的函数说明——其子进程会复制父进程的数据与堆栈空间,,Linux使用copy-on-write(COW)技术,只有当其中一进程试图修改欲复制的空间时才会做真正的复制动作,由于这些继承的信息是复制而来,并非指相同的内存空间,因此子进程对这些变量的修改和父进程并不会同步。此外,子进程不会继承父进程的文件锁定和未处理的信号

2.示例

#include <stdio.h>
#include <stdlib.h>
#include "unistd.h"
#include "sys/types.h"
#include "sys/wait.h"int main()
{int a=0;pid_t id=vfork();//建立子进程if(id>0)//父进程可进入执行的代码{wait(NULL);//等待子进程退出printf("a=%d\n",a);printf("father,id=%d\n",getpid());}if(id==0)//子进程可进入执行的代码{a=1;printf("son,id=%d\n",getpid());sleep(5);exit(1);//正常退出}printf("OK\n");return 0;
}

运行结果
son,id=56138
a=1
father,id=56137
OK

七、execl——执行文件

1.原函数

表头文件
#include "unistd.h"
定义函数
int execl(const char *path, const char *arg, ...);

函数说明——execl()用来执行参数path字符串所代表的文件路径,接下来的参数代表执行该文件时传递过去的argv(0)、argv[1]……,最后一个参数必须用空指针(NULL)作结束
path——文件路径字符串
arg——执行文件传递的参数
返回值——成功不会返回。失败返回-1,失败原因存于errno中

2.示例

#include <stdio.h>
#include "unistd.h"int main()
{int cp=execl("/bin/ls","ls",NULL);//执行路径/bin/ls的内容,参数为ls,所以意思相当于是执行ls指令printf("return?,cp=%d\n",cp);//如果execl执行成功则不会执行此条语句return 0;
}

运行结果:ls指令:列出当前文件夹下有哪些文件

八、execv——执行文件

1.原函数
表头文件

#include "unistd.h"
定义函数
int execv(const char *path, char *const argv[]);

函数说明——execv()用来执行参数path字符串所代表的文件路径
path——文件路径字符串
argv——利用数组指针来传递给执行文件
返回值——成功不会返回。失败返回-1,失败原因存于errno 中

2.示例

#include <stdio.h>
#include "unistd.h"int main()
{char *argv[]={"ls"};int cp=execv("/bin/ls",argv);//执行路径/bin/ls的内容,参数为argv,所以意思相当于是执行ls指令printf("cp=%d\n",cp);//如果execv执行成功则不会执行此条语句return 0;
}

运行结果:ls指令:列出当前文件夹下有哪些文件

九、system——执行shell 命令

1.原函数

表头文件
#include "stdlib.h"
定义函数
int system(const char *string);

函数说明——system()会调用fork()产生子进程,子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程
string——执行的字符串命名
返回值——
1:如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1
2:若参数string为空指针(NULL),则返回非零值
3:如果system()调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为system()调用/bin/sh失败所返回的127,因此最好能再检查errno来确认执行成功

2.示例

#include <stdio.h>
#include "stdlib.h"int main()
{int cp=system("ls");//执行shell指令:ls执行printf("cp=%d\n",cp);return 0;
}

运行结果
ls指令:列出当前文件夹下有哪些文件
cp=0

十、popen——建立管道I/O

1.原函数

表头文件
#include "stdio.h"
定义函数
FILE * popen( const char * command,const char * type);

函数说明——popen()会调用fork()产生子进程,然后从子进程调用/bin/sh -c来执行参数command的指令
command——执行的字符串指令
type——可使用“r”代表读取,“w”代表写入
返回值——成功则返回文件指针。错误返回NULL,错误原因存于errno中

2.示例

#include <stdio.h>
#include <string.h>int main()
{FILE *fp=popen("/home/CLC/b","r");//执行b指令printf("1 fp=%p\n",fp);//输出b指令对应的文件指针char data[30]={"\0"};fread(data,sizeof(char),30,fp);//读取fd文件对应的b指令运行结果printf("1 data=%s\n",data);//输出b指令运行的结果fp=popen("/bin/ls","r");//执行ls指令printf("2 fp=%p\n",fp);//输出ls指令对应的文件指针memset(data,'0',strlen(data));//将data数组清零fread(data,sizeof(char),30,fp);//读取fd文件对应的ls指令运行结果printf("2 data=%s\n",data);//输出ls指令运行的结果return 0;
}

运行结果

1 fp=指令b对应的文件指针
1 data=结果是运行b(文件编译后生成的指令)这个指令后生成的内容
2 fp=/bin/ls对应的文件指针
2 data=结果是指令ls输出的内容

喜欢的请点赞加关注,谢谢你

Linux API-进程:getpid、getppid、exit、wait、fork、vfork、execl、execv、system、popen相关推荐

  1. Linux编程:getpid与getppid

    getpid用于得到当前进程的id getppid用于得到当前进程的父进程的id #include <stdio.h> #include <stdlib.h> #include ...

  2. linux编程进程,Linux编程—进程

    1.进程的概念 进程是一个动态的实体,是程序的一次执行过程.进程是操作系统资源分配的基本单位. Linux下可通过ps或pstree查看当前系统中的进程. 查询正在运行的程序 ps -eo pid,c ...

  3. Linux下的进程控制原语【pid_t,fork,exec,wait,waitpid,getpid,kill,pasue,sleep,signal】

    目录 一.pid_t 进程号类型 二.与进程创建.执行有关的系统调用说明 fork()系统调用: exec 系统调用: wait() 和 waitpid() 系统调用: getpid()系统调用语法: ...

  4. 进程相关概念 读取当前进程getpid 读取父进程id getppid

    进程的认识 1.程序与进程之间的区别 程序就是没跑起来的进程 打开程序后,系统会生成一个进程 例如windows的桌面快捷方式就是一个程序 ,点击运行会生成一个进程 进程是程序的一次运行活动 通俗点的 ...

  5. Linux操作系统:操作系统与进程之fork、相关状态、僵尸进程

    文章目录 操作系统 什么是操作系统 操作系统如何管理 系统调用和库函数概念 为什么需要操作系统 进程 进程的概念 如何管理进程 一.描述 二.PCB 三.task_struct 进程相关操作 一.查看 ...

  6. linux创建进程读共享写复制,Linux进程创建之fork浅析

    在Linux 内核中,无时无刻不维护着进程,从进程的创建到进程销毁,每一个环境都有着复杂的细节.本篇介绍Linux 内核如何创建进程,深入理解 fork 函数以及子进程的创建,对理解多进程开发也至关重 ...

  7. 【Linux进程、线程、任务调度】二 fork/vfork与写时拷贝 线程的本质 托孤 进程睡眠和等待队列

    学习交流加(可免费帮忙下载CSDN资源): 个人微信: liu1126137994 学习交流资源分享qq群1(已满): 962535112 学习交流资源分享qq群2(已满): 780902027 学习 ...

  8. Linux系统调用--getpid/getppid函数详解

    [getpid/getppid系统调用]       功能描述: getpid返回当前进程标识,getppid返回父进程标识. 用法:  #include <sys/types.h> #i ...

  9. 【Linux】——进程创建fork()详解

    文章目录 一.fork()作用 二.fork()特性 1.父子进程之间的关系 2.父子进程返回情况 3.父子进程执行情况 4.父子进程的存储空间 5.父进程把存储空间拷贝给子进程的时机和方式 5.1写 ...

  10. 【Linux 内核】进程管理 ( 进程状态 | 进程创建 | 进程终止 | 调用 exit 系统调用函数主动退出 | main 函数返回自动退出 | kill 杀死进程 | 执行异常退出 )

    文章目录 一.进程状态 二.进程创建 三.进程终止 ( 调用 exit 系统调用函数主动退出 | main 函数返回自动退出 | kill 杀死进程 | 执行异常退出 ) 一.进程状态 Linux 进 ...

最新文章

  1. 随笔(很晚很晚,瞎写一通)
  2. 二叉树深度和平衡二叉树的判定
  3. mysql 触发器_进阶msql触发器-指南
  4. 天大计算机英语面试,天大学姐英语面试干货,适合“三无”考研党!
  5. redis make编译失败的原因
  6. 属于服务器操作系统的是,属于服务器操作系统的是
  7. uoj#188. 【UR #13】Sanrd(Min_25筛)
  8. pmw调光c语言程序,51单片机led灯渐变PWM调光(渐亮渐灭)C语言和汇编源程序
  9. Postgres外部表示例
  10. mysql 正则排序_MySQL-排序、GROUP BY、连接、NULL值处理、正则表达式、事务
  11. 微软官方office教程和微软官方office模板
  12. 基于stc89c52的智能温控风扇
  13. 股票量化中,复权是什么
  14. 如何让p标签里面的内容首行缩进
  15. 云计算机中弹性,什么是弹性云计算?
  16. 扒开思派健康招股书:大数据的面子,“卖药”的里子
  17. Kettle连接Mysql报错:Driver class org.gjt.mm.mysql.Driver could not be found
  18. 【NEUQ】PJ的情书 【哈夫曼树 】
  19. 苹果最早明年在Apple Watch中引入microLED显示屏
  20. EBC-B10电池容量测试仪之通信协议分析

热门文章

  1. #程序员公司用粉红键盘!网友:可爱,说话都带骚气,一定是男孩子
  2. CentOS开机进入dracut#
  3. vue 树形目录结构
  4. jmfapplet做一个简单的播放器
  5. yolov2训练自己的数据(win10超详细版)
  6. (超全面,超基础)Kriging插值推导理论笔记,算法,普通克里金
  7. 微信支付---测试用例
  8. mac操作系统快捷键总结
  9. Mac下的快速回到桌面快捷方式
  10. 2019年证券从业资格考试真题题库视频课程等资料汇总