实验一:熟悉Linux命令及进程管理

实验一:熟悉Linux命令及进程管理

一、实验目的

加深对进程概念的理解,明确进程和程序的区别。
进一步认识并发执行的实质。
分析进程争用资源的现象,学习解决进程互斥的方法

二、 实验内容和步骤

显示文件目录命令ls
改变当前目录命令cd
建立子目录mkdir
删除子目录命令rmdir
删除文件命令rm
文件改名命令mv
文件复制命令cp
显示文件的内容more或者less
查找文件find
重定向与管道 |
在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器。
通常在gcc后跟一些选项和文件名来使用gcc编译器。gcc 命令的基本用法如下::
gcc [options] [filenames]
命令行选项指定的操作将在命令行上每个给出的文件上执行

复习课本关于进程控制和进程同步的内容,加深对进程管理概念的理解。
认真阅读以下附录部分,分析多个进程的运行情况,并学会如何解决进程互斥。
运行以下附录部分中给出的程序,查看自己运行的结果,并进行分析。
编写程序,要求见附录部分

三、代码及运行结果分

#incldue<stdio.h>
int main()
{
printf("Hello Linux!\n");
}

在这里插入图片描述

#include<stdio.h>
#include<unistd.h> 
int main()
{
	printf("The current process ID is %d\n",getpid());
}

在这里插入图片描述

#include<stdio.h>
#include<sys/types.h>
#inlcude<unistd.h> 
int main()
{
	pid_t pid;
	pid=fork();	
	if(pid<0)
		printf("error in fork!");
	else if(pid==0)
		printf("I am the child process, my process ID is %d\n",getpid());
	else
		printf("I am the parent process, my process ID is %d\n",getpid());
} 

在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>
int main()
{
	printf("this process will exit!\n");
	exit(0);
	printf("never be displayed!\n");
}

在这里插入图片描述

#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
int main()
{
	pid_t pid;
	pid=fork();
	if(pid<0)
		printf("error occurred!\n");
	else if(pid==0)
		exit(0);
	else	
		sleep(60);	
		wait(NULL);
    } 

在这里插入图片描述
在这里插入图片描述

#include<stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h> 
main()
{
	pid_t pc,pr;
	pc=fork();
	if(pc<0)
		printf("error ocurred!\n");
	else if(pc==0){ 
		printf("This is child process with pid of %d\n",getpid());
		sleep(10);
	}
	else{
		pr=wait(NULL);
		printf("I catched a child process with pid of %d\n"),pr);
	}		
	exit(0);
	return 0;
}

在这里插入图片描述

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>  
#include <sys/wait.h>
int main()
{
int i,j,k;
if (i=fork())
{
j=wait(NULL);
printf("Parent Process!\n");
printf("i=%d,j=%d,k=%d\n",i,j,k);
}
else 
{
k=getpid();
printf("Child Process!\n");
printf("i=%d ,k=%d\n",i,k);
}
return 0;
}

在这里插入图片描述
我们可以看到wait阻塞了父进程,i=fork()的返回值是0,进入子进程,k即为当前子进程的进程ID。当子进程退出后,fork返回子进程的进程ID,wait不阻塞,j父进程捕获的子进程的进程ID,此时k为默认值0。

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <stdlib.h>
int main()
{
int p1,p2;
while((p1=fork())==-1);
if(p1==0)
{
printf("b.My process ID is %d\n",getpid());
}
else
{
while((p2=fork())==-1);
if(p2==0){
printf("c.My process ID is %d\n",getpid());
}
else{
printf("a.My process ID is %d\n",getpid());	
}
}
return 0;
}

在这里插入图片描述
我们可以看到p1=fork()调用后,产生父进程和子进程1,父进程再次执行fork(),再复制出一个子进程2,子进程2打印“a.My process ID is 2890”,子进程1打印“c.My process ID is 2892”,父进程打印“b.My process ID is 2891”.

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <stdlib.h>
void main()
{int m,n,k;
m=fork();
printf("PID:%d\t",getpid());
printf("The return value of fork():%d\t\t",m);
printf("he\n");
n=fork();
printf("PID:%d\t",getpid());
printf("The return value of fork():%d\t\t",n);
printf("ha\n");
k=fork();
printf("PID:%d\t",getpid());
printf("The return value of fork():%d\t\t",k);
printf("ho\n");
return 0;
}

在这里插入图片描述
以he为结尾的是最开始fork()所产生的父子两个进程。一个id为8212,一个为8213,8213是8212的子进程,此时8213没有子进程。以ha为结尾的是以上述两个进程为父进程,各自产生一个子进程所形成的。最后以ho为结尾的是以上述四个进程各自产生一个子进程所形成的。

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <stdlib.h>
void main()
{
int p1,p2,i;
while((p1=fork())==-1);
if(p1==0){
for(i=0;i<50000;i++){
printf("son %d\n",i);}
}
else
{
while((p2=fork())==-1);
if(p2==0){
for(i=0;i<50000;i++){
printf("daughter %d\n",i);}
}
else{
for(i=0;i<50000;i++){
printf("parent %d\n",i);}
}
}
return 0;
}

在这里插入图片描述
经过多次运行我们可以看出运行结果是乱序的。

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <stdlib.h>
void main()
{int m,n,k;
m=fork();
printf("PID:%d\t",getpid());
printf("The return value of fork():%d\t\t",m);
printf("he\n");
n=fork();
printf("PID:%d\t",getpid());
printf("The return value of fork():%d\t\t",n);
printf("ha\n");
if(m>0&&n>0){
k=fork();
printf("PID:%d\t",getpid());
printf("The return value of fork():%d\t\t",k);
printf("ho\n");
}
return 0;
}

在这里插入图片描述

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <stdlib.h>
void main()
{
int p1,p2,i;
while((p1=fork())==-1);
if(p1==0){
for(i=0;i<50000;i++){
printf("son %d\n",i);}
}
else
{
while((p2=fork())==-1);
if(p2==0){
for(i=0;i<50000;i++){
printf("daughter %d\n",i);}
}
else{
for(i=0;i<50000;i++){
printf("parent %d\n",i);}
}
}
return 0;
}

在这里插入图片描述
通过lockf函数实现对其中一个进程的进行而对其他进程的锁定,使得进行的进程间相互不被打断,最终输出结果。

总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值