叉子后无法从孩子的stdin读取?

时间:2017-03-04 11:33:22

标签: c shell fork

一个常规的C程序,一个shell程序的实现,它使用标准输入来获取命令并执行它们,其中main()被声明为:int main(int argc,char * argv []),正常工作。 它是一个小型shell程序,它打印一个提示并在循环中等待用户输入,并执行输入的命令。但是,我想在调用时使命令行参数不可见,如下所示:

  • 将main()函数重命名为old_main()。
  • 创建一个新的main()函数:
    • 将argv []字符串数组复制到新数组,然后复制
    • 删除原始的argv []结构。
    • 分叉本身并在子代中使用保存的命令行参数调用old_main,并退出父进程。

这适用于' ps -ef'现在显示没有显示命令行参数的命令运行。 但是,程序现在表现不同,并且不等待用户输入,而是保持打印提示。甚至Ctrl-C也不再起作用了。

但是,如果我将该程序称为:

$ echo quit | ./newprog 

命令'退出'执行(导致程序退出),因此程序在重定向stdin时仍然有效,但在交互模式下不起作用。

在新程序下面,它自己和子程序中使用保存的命令行参数调用旧主程序。

/* newprog.c */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define MAX_NARGS   40

extern int old_main(int nargc, char *nargv[]);    

int main(int argc, char *argv[])
{
    int i; pid_t pid;
    int nargc=argc;
    char *nargv[];
    nargv[0]=argv[0];

    for (i = 1; i < argc; i++)
    {
        nargv[i]=strdup(argv[i]);
        memset(argv[i],0,strlen(argv[i]));
    }
    nargv[i]=NULL;

    pid=fork();

    if (pid == 0)   return old_main(nargc, nargv); /* child calls old_main() */
    else if (pid == -1) printf("error: fork()\n");
    exit(0);  /* exit parent */
}

0 个答案:

没有答案