文章目录
实验环境
- Ubuntu 18.04
- Visual Code
实验记录
实验一:观察进程标识符
所用代码如下:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
//pid_t是数据类型,实际上是一个整型,通过typedef重新定义了一个名字,用于存储进程id
pid_t pid;
//scanf("%d",&i);//让进程等待,方便使用shell观察进程pid
pid= getpid(); //getpid()函数返回当前进程的id号
printf("Process id :%d\n", pid);
return 0;
}
使用如下命令打开gedit
gedit your_file_name
将代码复制到打开的文本编辑器里,并保存。使用如下指令进行编译
gcc your_file_name -o output_name
需要注意的是源代码必须以.c结尾,否则会报如下错误
运行,发现了进程的pid为:
将代码的scanf注释取消,重新运行,使用如下指令
ps -al
可在进程列表中观察到对于的进程:
实验二:子进程的创建
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
pid_t cid;
printf("Before fork Process id :%d\n", getpid());
/*
fork()函数用于创建一个新的进程,该进程为当前进程的子进程,创建的方法是:将当前进程的内存内容完整拷贝一份到内存的另一个区域,两个进程为父子关系,他们会同时(并发)执行fork()语句后面的所有语句。
fork()的返回值:
如果成功创建子进程,对于父子进程fork会返回不同的值,对于父进程它的返回值是子进程的进程id值,对于子进程它的返回值是0.
如果创建失败,返回值为-1.
*/
cid = fork();
printf("After fork, Process id :%d\n", getpid());
int i;
//scanf("%d",&i);//阻塞函数
return 0;
}
运行结果为
可以发现两个现象:
- 出现了两个Afterfock语句,原因在于使用了fock函数后,Linux创建了一个进程,该进程的EIP寄存器值被设为fock()函数后的语句
- 在两个Afterfock语句之间出现了shell提示符,该原因为在子进程在主进程运行完成之后才被调度,此时shell进程已被调度,输出了shell提示符。将阻塞函数加入后,再次运行。
可以发现猜测是正确的。
利用ps -al指令可以观察到PID(process id)和PPID(parent process id)
实验三:观察进程并发执行
实验代码为:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
pid_t cid;
printf("Before fork process id :%d\n", getpid());
cid = fork();
if(cid == 0){
//该分支是子进程执行的代码
printf("Child process id (my parent pid is %d):%d\n", getppid