myshell(支持管道)

本文介绍了如何在自定义shell中实现管道功能,通过检查命令行输入是否包含管道符号,分割命令并使用fork和execvp在子进程和孙子进程中执行。关键点在于管道的创建必须在子进程且在孙子进程之前,父进程则等待子进程完成。
摘要由CSDN通过智能技术生成

首先总结一下思路:

1. 如果要支持管道就首先需要分析命令中是否包含管道。(使用stringcmp函数)

2.如果包含管道就将管道符号位置为NULL,然后将管道符号前后的命令分到两个指针数组中 即:tmp1[ ]和tmp2[ ]

3.这个时候需要执行两个execvp函数,我们为了保证循环的进程不会被替换,需要fork两次,分别用孙子进程执行tmp1[ ]和子进程执行tmp2[ ]。

4.关于管道创建的位置(很关键),创建的位置要在儿子进程中,并且在孙子进程创建之前。(在其他位置会发生不知名错误)。

父进程等待就行了。

以下是代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>

 
void do_parse(char *buf,char* argv[])
  {
    if(buf==NULL)
    {
        return;
    }
    if(argv==NULL)
    {
        return;
    }
    int i;
    int argc=0;
    int status=0;

    for(i=0;buf[i];i++)
   {
      if(  !isspace(buf[i])   &&   status==0)
      {
       argv[argc+&
进程控制是指操作系统对进程的创建、调度、运行和终止等操作进行管理和控制的过程。而myshell.c是一个用C语言编写的shell程序,用于模拟操作系统的命令行界面。 在myshell.c中,进程控制主要包括以下几个方面: 1. 进程的创建:myshell.c通过fork()系统调用创建新的进程。通过这个调用,父进程创建一个与其完全相同的子进程,并且子进程继承了父进程的文件描述符、代码段、数据段等信息。 2. 进程的调度与运行:myshell.c使用exec()系统调用来运行其他程序。通过这个调用,进程可以将自己的代码段替换为另一个程序的代码段,并开始执行该程序。这样,myshell.c可以实现执行其他的命令或程序。 3. 进程的等待与退出:myshell.c可以通过wait()系统调用等待子进程的结束,并获取子进程的终止状态。同时,还可以使用exit()系统调用来终止当前进程的运行。 4. 进程的信号处理:myshell.c可以通过signal()系统调用对进程接收到的信号进行自定义处理。通过设置信号处理函数,可以实现对特定信号的捕获和处理操作。 5. 进程的管道通信:myshell.c可以通过pipe()系统调用创建管道,实现进程间的通信。通过管道,不同的进程可以在内存中创建一个缓冲区,实现数据的传输。 通过对进程控制相关函数的调用,myshell.c能够实现对进程的创建、调度、运行和终止等操作。这样,在shell程序中,我们可以输入命令并执行,通过进程控制,实现程序的运行和管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值