文章目录本文中的章节都是以疑问句的形式记录,也是希望大家带着问题来学习、总结进程相关知识。说不定会在以后的面试中会被问到。
- 一、什么是程序,进程?(面试)
- 二、什么是进程标识符?(面试)
- 三、如何查看系统中有哪些进程?
- 四、c程序的存储空间是如何分配的?(面试)
- 五、创建子进程
- 1.fork()
- 2.fork()创建的子进程数据情况
- 3.vfork()创建子进程的数据情况
- 4.fork()创建子进程的目的?
- 六、几种特殊进程
- 七、exec*族函数
- 八、system函数
- 九、poen函数
一、什么是程序,进程?(面试)
程序:就是一些指令和数据的集合是一个静态的概念。
进程:简单来说就是运行中的程序,是一个动态的概念。
二、什么是进程标识符?(面试)
每个进程都有自己唯一的非负整数来表示进程称为进程标识符。
三、如何查看系统中有哪些进程?1.ps -aux
2.top
#include2.fork()创建的子进程数据情况#include #include #include int main() { pid_t pid; int data=0; pid=fork(); while(1){ if(pid==0){ printf("this is child process!my pid=%dn",getpid()); } else if(pid>0){ printf("this is parent proscess!my pid=%dn",getpid()); } } return 0; }
由fork()创建的子进程,是父进程的副本。子进程拥有父进程的数据空间,堆,栈的一份拷贝,但父子进程不共享这部分空间。
#include3.vfork()创建子进程的数据情况#include #include #include int main() { pid_t pid; int data=0; pid=fork(); printf("before fork data = %dn",data); if(pid==0){ printf("this is child process!my pid=%dn",getpid()); printf("data in child process = %dn",data); } else if(pid>0){ printf("this is parent proscess!my pid=%dn",getpid()); data++; printf("data in parent process = %dn",data); } return 0; }
vfork创建的父子进程,共享数据空间,且父进程等待子进程运行完,所以子进程结束需要调用exit()函数不然父进程不知道子进程退出与否,还一直等。
#include4.fork()创建子进程的目的?#include #include #include int main() { pid_t pid; int data=0; pid=vfork(); printf("before fork data = %dn",data); if(pid==0){ printf("data in child process = %dn",data); data++; printf("this is child process!my pid=%dn",getpid()); sleep(1); exit(1); } else if(pid>0){ sleep(1); printf("this is parent proscess!my pid=%dn",getpid()); printf("data in parent process = %dn",data); } return 0; }
1.通常在网络服务进程经常会使用到,父进程等待客户端的请求,当请求到达时,使用fork()与客户端进行对接。当再来一个对接信号时,再fork()
2.一个进程需要执行不同的程序时,使用fork()通常与exec*族函数配合使用
1.进程0:也叫做交换进程(swapper)(内核态进程)
2.进程1:也叫做init进程(用户态进程)
3.僵尸进程:父进程不关心子进程的运行情况,wait(NULL)(有危害–容易导致崩溃)
4.孤儿进程:父进程先于子进程退出,被init进程收养。(无危害)
execl(“文件路径”,“可执行文件名”,参数,NULL)
#include八、system函数#include #include #include #include #include #include #include #include #include int main() { pid_t pid; int data = 10; while(1){ printf("please input a datan"); scanf("%d",&data); if(data == 1){ int fdSrc; pid = fork(); if(pid > 0){ wait(NULL); } if(pid == 0){ execl("./changData","changData","config.txt",NULL); } } else{ printf("wait ,do nothingn"); } } return 0; }
#include九、poen函数#include #include #include #include #include #include #include #include #include int main() { pid_t pid; int data = 10; while(1){ printf("please input a datan"); scanf("%d",&data); if(data == 1){ int fdSrc; pid = fork(); if(pid > 0){ wait(NULL); } if(pid == 0){ // execl("./changData","changData","config.txt",NULL); system("./changData config.txt"); } } else{ printf("wait ,do nothingn"); } } return 0; }
poen比system在应用中的好处:
可以获取运行的输出结果
#include#include #include //int execl(const char *path, const char *arg, ...); //size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream) int main(void) { char ret[1024] = {0}; FILE *fp; fp = popen("ps","r"); int nread = fread(ret,1,1024,fp); printf("read ret %d byte, ret=%sn",nread,ret); return 0; }



