posts - 403, comments - 310, trackbacks - 0, articles - 7
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

模仿命令行shell的简单程序

Posted on 2007-08-04 00:20 ZelluX 阅读(557) 评论(0)  编辑  收藏 所属分类: C/C++
APUE上的例程,稍微改了下,在进程开始和结束的时候会分别显示当前的PID和退出状态。
不支持参数
1. fgets命令从标准输入读入命令,当键入文件结束字符(通常是Ctrl+D)时进程结束
2. 以\0替换输入命令的最后一个字符,即去掉换行符,使得execlp能够处理
3. fork函数创建一个新进程,对父进程返回新的子进程的非负PID,对子进程返回0
4. 在子进程中,调用execlp以执行从标准输入读入的命令。fork和exec的组合产生了一个新进程
5. 新的子进程开始执行后,父进程等待子进程的终止,这一要求由waitpid实现
6. 执行这个程序后还可以在这个简易shell中创建新的自身的进程

#include <sys/types.h>
#include 
<sys/wait.h>
#include 
"ourhdr.h"

int main(void)
{
    
char    buf[MAXLINE];
    pid_t   pid;
    
int     status;

    printf(
"%% ");
    
while (fgets(buf, MAXLINE, stdin) != NULL)
    {
        buf [strlen(buf) 
- 1= 0;

        
if ( (pid = fork()) < 0)
            err_sys(
"fork error");
        
else if (pid == 0)
        {
            execlp(buf, buf, (
char *0);
            err_ret(
"couldn't execute: %s", buf);
            exit(
127);
        }

        printf(
"*** %d ***\n", status);

        
/* parent */
        
if ( (pid = waitpid(pid, &status, 0)) < 0)
            err_sys(
"waitpid error");

        printf(
"*** %d ***\n", pid);
        printf(
"%% ");
    }
    exit(
0);
}


只有注册用户登录后才能发表评论。


网站导航: