linux管道编程(实验4)

linux管道编程

1.实验目的
① 了解与掌握linux操作系统的基本操作
② 了解并掌握管道的工作原理
2.实验平台
操作系统:Linux
3.实验内容和要求
(一)操作实验任务
① 熟悉采用命令ln在文件与目录之间创建链接
② 掌握硬链接和软链接的区别
③ 首先在/opt目录下建立一个文件夹test_ln,然后将/tmp/file_temp/file1.txt 建立硬链接到/opt/test_ln
④ 将/tmp/file_temp/file1.txt 建立软链接到/opt/test_ln
⑤ 阅读附件find文档,测试find命令的多种组合查找文件的方法。
(二)编程实验任务
编写一个程序,建立一个管道。父进程生成两个子进程,p1和p2,两个子进程分别向管道中写入各自的字符串,父进程读出它们。(p1写:child process P1,p2写:child process P2)

实验内容与完成情况:
(一)操作实验任务

① 熟悉采用命令ln在文件与目录之间创建链接

 	 ln 被链接的文件名称 连接的目录名称
	 硬连接直接:ln  而软连接则需要加入参数:ln -s 
	 具体操作看下面的实验

② 掌握硬链接和软链接的区别

	硬链接:新建的文件是已经存在的文件的一个别名,当原文件删除时,
		   新建的文件仍然可以使用。
	软链接:也称为符号链接,新建的文件以“路径”的形式来表示另一个文件,
		   和Windows的快捷方式十分相似,新建的软链接可以指向不存在的文件.
	1.硬链接和原来的文件没有什么区别,而且共享一个 inode 号(文件在文件
	  系统上的唯一标识);而软链接不共享 inode,也可以说是个特殊的 
	  inode,所以和原来的 inode 有区别。
	2.若原文件删除了,则该软连接则不可以访问,而硬连接则是可以的。

③ 首先在/opt目录下建立一个文件夹test_ln,然后将/tmp/file_temp/file1.txt 建立硬链接到/opt/test_ln
1、在/opt下建立一个文件夹test_ln

root@kali:~# mkdir /opt/test_ln 

2、/tmp/file_temp/file1.txt 建立硬链接到/opt/test_ln

root@kali:~# ln tmp/file_temp/file1.txt /opt/test_ln

④ 将/tmp/file_temp/file2.txt 建立软链接到/opt/test_ln

root@kali:~# ln -s tmp/file_temp/file2.txt /opt/test_ln

因为前面已经将file1.txt进行了硬链接,所以再将file1.txt与test_ln进行链接无法成功,只能新建file2.txt进行软链接。

通过ls -li /opt/test_ln可以查看软连接与硬连接的区别

root@kali:~# ls -li /opt/test_ln

⑤ 阅读附件find文档,测试find命令的多种组合查找文件的方法。

1、根据文件名检索

  • 查找 /usr 下所有文件名以 .txt 结尾的文件或目录,且该文件的父目录必须是 src
root@kali:~# find /usr -path '*/src/*.txt'
  • 查找 /usr 目录下所有文件名以 .txt 结尾的文件
root@kali:~# find /usr -name '*.txt'
  • 查找 /usr 目录下所有文件名刚好为 4 个字符的文件
root@kali:~# find /usr -name '????'

2、根据文件类型检索

  • 检索 /usr 下所有文件名以 python 开头的目录
root@kali:~# find /usr -type d -name 'python*'

3、检索空文件

  • 检索用户主目录下所有的空目录
root@kali:~# find ~ -type d -empty

4、反义匹配

  • 检索 /usr 下所有文件名不以 .txt 为后缀的文件
root@kali:~# find /usr -type f ! -name '*.txt'

5、 根据文件大小检索

  • 检索文件大小低于1G的文件(±表示大于或者小于)
root@kali:~# find / -size -1G

(二)编程实验任务
编写一个程序,建立一个管道。父进程生成两个子进程,p1和p2,两个子进程分别向管道中写入各自的字符串,父进程读出它们。(p1写:child process P1,p2写:child process P2)

#include <stdio.h>
#include <unistd.h>
#include<unistd.h>
#include<sys/wait.h>
main()
{
	int i,r,p1,p2,fd[2];
	char buf[50],s[50];
	pipe(fd);
	while((p1=fork())==-1);
	if(p1==0)
	{
		lockf(fd[1],1,0);
		sprintf(buf,"child process P1 is sending messages! \n");
		printf("child process P1! \n");
		write(fd[1],buf,50);
		sleep(5);
		lockf(fd[1],0,0);
		exit(0);
	}
	else
	{
		while((p2=fork())==-1);
		if(p2==0)
		{
			lockf(fd[1],1,0);
			sprintf(buf,"child process P2 is sending messages! \n");
			printf("child process P2! \n");
			write(fd[1],buf,50);
			sleep(5);
			lockf(fd[1],0,0);
			exit(0);
		}
	}
	wait(0);
	if((r=read(fd[0],s,50))==-1)
		printf("can't read pipe\n");
	else
		printf("%s\n",s);
	wait(0);
	if((r=read(fd[0],s,50))==-1)
		printf("can't read pipe\n");
	else
		printf("%s\n",s);
	exit(0);
}

猜你喜欢

转载自blog.csdn.net/YZ_TONGXIE/article/details/106773900