Download as pdf or txt
Download as pdf or txt
You are on page 1of 8

Linux 开发环境及应用实验报告

!"#$%!" &' SHELL ()*+,-!


"#$%&!!!!! ! '()*$++,-.,+-!
/0$+-12+2---2! ! ' ( 3 4 ) * $++,-.,+2!!!!!
%
./0123456789:;<=>?@AB>?@CDEF%
Mac 系统
虚拟平台:
Mac 系统 - Terminal 终端。
学校提供的 Ubuntu 虚拟机。
二. !"G9'%
三. '(56789:;<=>?@ABCD>EFG>HIJKL
MNO

• Pipe () 函数:

o pipe()函数可用于创建一个管道,以实现进程间的通信。
o 对于这项任务,我将使用 pdf[]代表 pipe()函数创建一个管道,
pfd[0]和 pfd[1]分别为管道两端的文件描述符:
§ pfd[0]用于读
§ pfd[1]用于写

• Fork()函数

o 创建新进程普通文件:列出文件

o 目录:列出目录下所有文件

• Wait ()函数
o 等待进程的子进程终止
o 如果已经有子进程终止,则立即返回

• Exec () 系统调用
o Exec 不创建新进程,只是将当前进程重新初始化了指令段和用户数
据段,堆栈段以及 CPU 的 PC 指针
o exec 系统调用可以用 int execlp (char *file, char *arg0, char *arg1
,...,0);
• 编辑,编译 vim shell .c :
%

!" !"HIJ9KLM2NOPQ!"RM>STUEF%

PQ execlp("grep", "grep", "-v", "usr", 0) 和 execlp("wc", "wc", "-l", 0) 变成


execlp("grep", "grep", "-v", "usr", NULL) 和 execlp("wc", "wc", "-l", NULL)
#" !"RM2NOPQ!"RM>STUEF%

• gcc shell.c -o shell


• shell. c 源代码:

//
// Created by 何威-2019290009 on 2022/5/29.
//
#include<stdio.h>
#include<unistd.h>
#include <errno.h>
#include<fcntl.h>
#include<sys/wait.h>
#include<sys/types.h>
#include <string.h>

int main()
{
int sv, pfd[2], in, out;
char *file;
pipe(pfd); //创建管道
file="/etc/passwd";
in=open (file, O_RDONLY);
file="r1.txt";
out=open(file, O_CREAT | O_WRONLY); //打开文件
if(fork() == 0) {
dup2(in, 0); //输入重定向
dup2(pfd[1], 1);
close(pfd[1]);
close(pfd[0]);
execlp("grep", "grep", "-v", "usr",NULL); //系统调用

}else if (fork() == 0) {
dup2(pfd[0], 0);
dup2(out, 1); //输出重定向
close(pfd[1]);
close(pfd[0]);
execlp("wc", "wc", "-l", NULL); //系统调用
}
close(pfd[0]); //不加则会死循环
close(pfd[1]);
wait(&sv);
wait(&sv); //不加则会导致僵尸进程
return 0;
}
%

You might also like