Linux进程笔记
1.什么是程序,什么是进程,有什么区别
** 程序是静态的概念,gcc xxx.c –o pro磁盘中生成pro文件,叫做程序。进程是程序的一次运行活动,通俗点意思是程序跑起来了,系统中就多了一个进程**
2. 如何查看系统中有哪些进程?
** 使用指令 ps - aux
可以查看所有进程
使用 ps -aux|grep ***
,可以只查找想要的进程
**
3.什么是进程标识符
** 每个进程都有一个非负整数表示的唯一ID,
叫做pid,类似身份证。利用getpid()
可以获取自身的进程标识符
利用getppid()
获取父进程的进程标识符。
**
4.什么叫父进程,什么叫子进程
** 进程A创建了进程B那么A叫做父进程,B叫做子进程,父子进程是相对的概念,理解为人类中的父子关系
**
5.c程序的存储空间是如何分配的
** 有代码段,数据段(初始化数据段和未初始化数据段),堆,栈,命令行参数和环境变量
**
fork函数介绍
所需头文件和函数原型
#include <unistd.h>
pid_t fork(void);
fork函数调用成功(创建父子进程,pid不相同),返回两次
返回值为0, 代表当前进程是子进程
返回值非负数,代表当前进程为父进程
调用失败,返回-1
下面例子证明,运行结果这里就不展示了(头文件自己加)
int main()
{
pid_t retpid;
retpid = fork();
if(retpid > 0){
printf("this is father print,retpid = %d\n\n",retpid);
}
else if(retpid == 0){
printf("this is child,child retpid = %d\n",retpid);
}
return 0;
}
fork函数:
1、fork()是创建进程函数。
2、c程序一开始,就会产生 一个进程,当这个进程执行到fork()的时候,会创建一个子进程。
3、此时父进程和子进程是共存的,它们俩会一起向下执行c程序的代码。
4、需要注意!!!子进程创建成功后,fork是返回两个值,一个代表父进程,一个代表子进程:代表父进程的值是一串数字,这串数字是子进程的ID;一个代表子进程,值为0。
vfork函数介绍
vfork函数 也可以创建进程,与fork的区别
1.vfork直接使用父进程的存储空间,不拷贝
2.vfork保证子进程先运行,当子进程调用exit()
退出后父进程才执行。
父进程等待子进程退出(是否收集子进程退出状态)
1.子进程退出状态不被收集,则会变成Z+(僵尸进程)
2.调用wait函数,收集子进程退出状态
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);
wait(&status);
printf("child quit,child status = %d \n",WEXITSTATUS(status));
该printf输出的值为子进程中exit()的参数。
在调用wait()
等待子进程的时间里,父进程处于阻塞状态,当调用waitpid()
等待子进程的退出状态时,父进程不阻塞
孤儿进程
父进程如果不等待子进程退出,在子进程之前就结束了自己的“生命”,此时子进程叫做孤儿进程。
Linux避免系统存在过多孤儿进程,initinit进程id号为1,详细介绍请点击进程收留孤儿进程,变成孤儿进程的父进程。
exec族函数
exec族函数函数的作用:
我们用fork函数创建新进程后,经常会在新进程中调用exec函数去执行另外一个程序。当进程调用exec函数时,该进程被完全替换为新程序。因为调用exec函数并不创建新进程,所以前后进程的ID并没有改变。
返回值:
exec函数族的函数执行成功后不会返回,调用失败时,会设置errno并返回-1,然后从原程序的调用点接着往下执行。
execl("./echoarg","echoarg","aaa",NULL);
#include <stdio.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
printf("before execl\n");
if(execl("/bin/ls","ls","-l",NULL) == -1){
printf("execl error\n");
perror("why");
}
printf("after execl\n");
return 0;
}
execl和execlp的区别
execlp可以自动寻找可执行文件的地址。
popen
1.简介
创建一个管道,然后再创建一个进程。然后执行命令
2.调用格式
#include <stdio.h>
FILE *popen(const char *command, const char *type);
3.参数介绍
command:是一个指向以NULL结束的shell命令字符串的指针。这行命令将被传到/bin/sh并使用 -c标志,shell将执行这个命令
type:只能是只读或只写中的一种,得到的返回值(标准I/O流)也具有和type相应的只读或只写类型。如果type是"r",则文件指针连接到command的标准输出;如果type是"w",则文件指针连接到command的标准输入
例子:
#include <stdio.h>
#include <string.h>
int main(void)
{
FILE *fp = NULL;
char buf[10240] = {0};
fp = popen("ls","r");
if(fp == NULL){
return 0;
}
fread(buf, 10240, 1, fp);
printf("%s\n",buf);
pclose(fp);
return 0;
}