在C中实现一个shell
即时通讯目前在C中实现一个shell我的问题出现时,我尝试运行一个像这样的命令:
SHELL$: sort < txtFile | grep key
即时通讯运行sort < txtFile
在一个进程(子),并在父母,即else if(pid > 0)
即时通讯管道右侧运行其他命令。
该程序运行良好,但它退出我主要设置的无限循环,以继续接收来自用户的输入。
我怎么能解决这个问题?
这是我到目前为止处理管道的代码,我没有包含我必须处理重定向的代码:
c2p是我为此设置的管道。
if(pid == 0)
{
if( PIPE_FLAG )
{
close(c2p[0]);
if(dup2(c2p[1], STDOUT_FILENO) == -1){
perror("dup2() failed");
exit(2);
}
}
/* Execute command */
execvp(cmd_args[0], cmd_args);
perror("exec failed 1. "); /* return only when exec fails */
exit(-1);
}
else if(pid > 0)
{
if(PIPE_FLAG)
{
close(c2p[1]);
if(dup2(c2p[0], STDIN_FILENO) == -1){
perror("dup2() failed");
exit(-1);
}
execvp(nxt_args[0], nxt_args);
perror("exec failed 2. ");
exit(-1);
}
}
else
{
/* error occurred */
perror("fork failed");
exit(1);
}
我在子进程中运行sort < txtFile
,在父进程中,我在管道右侧运行命令。
那么你的shell进程会发生什么? 父进程是shell。 通过在父进程中运行右侧命令,您可以接管shell的进程。 请记住,exec()取代当前进程。
您需要fork()两次,然后在子进程中执行管道的两侧。 父级必须保持为shell,然后在展示下一个命令提示符之前,它将等待()孩子退出。
/* How shell works */
#include<stdio.h>
#include<unistd.h>
main (int argc, char **argv)
{
if (argc < 2)
{
fprintf (stderr, "nUsage: ./a.out cmd [options]...n");
}
if (!fork ())
{
argv++;
execvp (argv[0], argv);
}
}
链接地址: http://www.djcxy.com/p/75569.html
上一篇: implementing a shell in C
下一篇: How to handle CSRF in preflighted CORS POST request in django?