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