2009-05-27 46 views
0

我正在构建一个执行各种命令的小shell解释器,并通过分解我的进程来完成此操作。用EOF提供输入流

但是,我希望子进程停止等待标准输入流中的输入,并且它会通过预期EOF来实现。我如何故意将EOF推入该流?

更具体地说,如果我在此条件下循环:

while (fgets(&input, 1024, stdin) != NULL) { // ..... 

我怎样才能使其成为假的?

+0

你需要给更多的信息。孩子的stdin是否与父母有联系(又名共同处理)?要么...? – dwc 2009-05-27 14:49:23

+0

键入Ctrl-D? “的putchar(EOF)”? – 2009-05-27 14:50:14

+0

@Chris EOF通常是一个#define -1 -1 – 2009-05-27 14:51:07

回答

1

不知道你的shell正在做什么 - 但我会认为这样做的方式是关闭fork()的子端的“标准输入流”,然后不要再读它。如果你让一个孩子做了什么,为什么它回到主输入处理循环。

在伪代码

if (pid = fork()) 
{ 
    // parent - wait for child to do it's thing and then process another command 
} 
else 
{ 
    // child 
    close(0); 
    // do some sort of command processing and then exit 
} 
+0

听起来很合理。如何“关闭”C中的stdin? – 2009-05-27 14:57:15

+0

fclose(),明白了 – 2009-05-27 14:59:47

1

正常的方法是在发送(父)端关闭流。

+0

我会怎么做这样的事情? – 2009-05-27 14:50:20

+0

你是怎么打开它的?通常,您可以使用close()系统调用或类似的方法。 – 2009-05-27 14:52:14

+0

就像我说过的,我只是用fgets()读取字符串() – 2009-05-27 14:54:21

0

难道你只是关闭管道的另一端?