[英]implementing a shell in C
我目前在C中實現一個shell。當我嘗試運行這樣的命令時,我的問題出現了:
SHELL$: sort < txtFile | grep key
我在進程(子)和父進程中運行sort < txtFile
, else if(pid > 0)
我正在運行管道右側的另一個命令。
該程序運行正常,但它退出我在main中設置的無限循環,以保持接收用戶的輸入。
我怎么能解決這個問題?
這是我到目前為止處理管道的代碼,我沒有包含我必須處理重定向的代碼:
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,然后wait()等待孩子退出,然后再顯示下一個命令提示符。
/* 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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.