我正在尝试实现一个简单的shell。我以这种方式分叉处理:
void forkProcess(char* cmd[]) {
pid_t pid;
char programPath[BUFFERLENGTH] = "/bin/";
strcat(programPath, cmd[0]);
int exitStatus;
pid = fork();
switch (pid) {
case -1:
printf("Fork failed; pid == -1\n");
break;
case 0:
execv(programPath, cmd);
exit(0);
break;
default:
waitpid(pid, &exitStatus, 0);
//printf("Exitstatus = %d\n", WEXITSTATUS(exitStatus));
break;
}
}
现在cmd
参数可能包含管道,例如:
"ls" "-l" "|" "grep" "whatever" "(char*)NULL";
那么我该如何实现管道功能呢?我知道有pipe()
和dup()
等功能,但我不知道如何在这种情况下使用它们。
感谢您提出任何建议。
答案 0 :(得分:1)
您必须在fork()
启动孩子之前完全解析命令行。
如果正在使用管道运算符,则必须在调用fork()
之前设置管道,因此它是继承的。
通常,您还必须使用close()
和dup()
来使管道替换分叉进程的stdin。
继续阅读这些功能以“全面了解”,或者获得一本涵盖Unix I / O的书。
答案 1 :(得分:0)
在这种情况下,您可以使用popen()。