当前位置: 技术问答>linux和unix
直接在终端启动程序和通过脚本或者exec函数执行有何不同?
来源: 互联网 发布时间:2017-03-13
本文导语: 各位大神,我碰到一个问题困扰了我一整天。就是我现在要把一个进程的输出重定向到一个文件中。我写了一个小程序,在程序中fork出一个子进程,在子进程里把输出重定向,然后用exec去执行它。 如果我在终端里敲...
各位大神,我碰到一个问题困扰了我一整天。就是我现在要把一个进程的输出重定向到一个文件中。我写了一个小程序,在程序中fork出一个子进程,在子进程里把输出重定向,然后用exec去执行它。
如果我在终端里敲入命令直接执行这个小程序,输出确实会重定向到我指向的文件中。问题是,如果我把这个小程序放到脚本里去执行(脚本里的命令和我在终端敲入的一样)或者是后台执行这个小程序,会导致cpu 100%,那个重定向的文件瞬间就被写的很大了。原因是那个进程会不断的输出同一个字符串到文件里。这里说明一下,这个进程启动后有点类似shell,打印一个提示符,然户等待用户输入命令,打印出执行结果,然后重新打印提示符,如此循环...,上面说的那个不断写入的字符串就是这个提示符。昨天花了一整天时间,也没搞定,只好上来求助了。大家帮我分析分析,是什么原因?为什么从终端里敲入命令和shell执行或者后台执行结果会不一样?
如果我在终端里敲入命令直接执行这个小程序,输出确实会重定向到我指向的文件中。问题是,如果我把这个小程序放到脚本里去执行(脚本里的命令和我在终端敲入的一样)或者是后台执行这个小程序,会导致cpu 100%,那个重定向的文件瞬间就被写的很大了。原因是那个进程会不断的输出同一个字符串到文件里。这里说明一下,这个进程启动后有点类似shell,打印一个提示符,然户等待用户输入命令,打印出执行结果,然后重新打印提示符,如此循环...,上面说的那个不断写入的字符串就是这个提示符。昨天花了一整天时间,也没搞定,只好上来求助了。大家帮我分析分析,是什么原因?为什么从终端里敲入命令和shell执行或者后台执行结果会不一样?
|
看你的描述,你只是在你的小程序里面把子进程的输出1重定向了,而输入0没有
这种情况下,终端里直接敲小程序的命令应该没问题,,因为你的小程序和和子进程都处理前台
在脚本里,从终端敲脚本命令应该也没问题
如果在后台运行的时候,,该程序会读输入0,但是此时后台的情况下是读会出错。(我知道是会产生信号SIGTTYIN使程序stopped,他应该是将其IGNORE了) 。 而如果程序忽略此错误的话,,那么比如里面用的是select东西那每次都会成功,,但又读不到东西,所以一直输出提示符。
你应该在你的小程序里面生成一个pipe,fd[0],fd[1],,,fd[0]重定向给子进程,fd[1]不管,,,,子进程的输出还是重定向到文件,,试试。。
这种情况下,终端里直接敲小程序的命令应该没问题,,因为你的小程序和和子进程都处理前台
在脚本里,从终端敲脚本命令应该也没问题
如果在后台运行的时候,,该程序会读输入0,但是此时后台的情况下是读会出错。(我知道是会产生信号SIGTTYIN使程序stopped,他应该是将其IGNORE了) 。 而如果程序忽略此错误的话,,那么比如里面用的是select东西那每次都会成功,,但又读不到东西,所以一直输出提示符。
你应该在你的小程序里面生成一个pipe,fd[0],fd[1],,,fd[0]重定向给子进程,fd[1]不管,,,,子进程的输出还是重定向到文件,,试试。。