南京邮电大学操作系统——实验一:进程、线程的创建与并发执行

实验环境

  • 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值