Linux下如何用c语言获取shell的管道文件描述符?

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
phi
帖子: 15
注册时间: 2014-01-29 23:06
系统: Ub
送出感谢: 2 次
接收感谢: 0

Linux下如何用c语言获取shell的管道文件描述符?

#1

帖子 phi » 2018-07-06 6:22

最近想编写一个用C语言处理shell下管道数据流的程序,但不知如何用C获取当前shell命令管道输出的文件描述符?请教一下大家 :Haha

注意:不是在Linux C环境下创建管道然后利用它进行进程间通讯,那样的话管道的文件描述符是已知的。这里需要用C编写的程序接收shell命令结果的管道输出,处理完成后再由管道传给后续shell命令处理。用read()和write()向管道读写数据时需要事先知道shell命令管道输出对应的文件描述符。 :Sad

我使用fgets()做了一下,管道数据流原封不动的接力传递没有问题,但是经过处理后的数据再次输出时总是报告“段错误”,不知为何?好像是fgets()只能处理ASC2码数据,不适合二进制数据吧。可获取的数据流的确是ASC2码的文本流,至于输出也用不着这个呀。 :Faint
头像
astolia
论坛版主
帖子: 3153
注册时间: 2008-09-18 13:11
送出感谢: 1 次
接收感谢: 527 次

Re: Linux下如何用c语言获取shell的管道文件描述符?

#2

帖子 astolia » 2018-07-06 16:12

shell里的管道输入不都是stdin/0,输出不都是stdout/1么?
段错误基本都是你自己的代码有问题,自己调试一下啊。生成个core dump,用gdb查问题点 https://blog.csdn.net/learnhard/article/details/4879834
头像
phi
帖子: 15
注册时间: 2014-01-29 23:06
系统: Ub
送出感谢: 2 次
接收感谢: 0

Re: Linux下如何用c语言获取shell的管道文件描述符?

#3

帖子 phi » 2018-07-07 0:02

astolia 写了:
2018-07-06 16:12
shell里的管道输入不都是stdin/0,输出不都是stdout/1么?
段错误基本都是你自己的代码有问题,自己调试一下啊。生成个core dump,用gdb查问题点 https://blog.csdn.net/learnhard/article/details/4879834
shell 是与系统交互的高级语言,在shell里有一个stdin/:0,stdout/:1,stderr/:2的概念,但这应该是经过封装后的高层表述了。在系统的母语里对于shell里的每一个管道在系统层都对应一个唯一只存在于内存中的文件。这些文件与其父进程文件间应该有继承关系,我想知道管道类文件的根结点描述符(类似windows里的“句柄)。
头像
astolia
论坛版主
帖子: 3153
注册时间: 2008-09-18 13:11
送出感谢: 1 次
接收感谢: 527 次

Re: Linux下如何用c语言获取shell的管道文件描述符?

#4

帖子 astolia » 2018-07-07 14:00

与其这在里“应该”这样“应该”那样想当然,你倒是去随便买本linux下c编程的书认真读一下啊。你的想象根本和事实不符。
我觉得你是把管道(pipe)和命名管道(fifo)弄混了。管道确实在内核里有自己的标识符,但这根本不是你的程序需要关心的事。你的程序老老实实从stdin/0里读数据,往stdout/1里写数据就完了,shell自然会帮你处理好其他的事务
这些用户感谢了作者 astolia 于这个帖子:
科学之子 (2018-07-07 15:10)
评价: 3.7%
头像
phi
帖子: 15
注册时间: 2014-01-29 23:06
系统: Ub
送出感谢: 2 次
接收感谢: 0

Re: Linux下如何用c语言获取shell的管道文件描述符?

#5

帖子 phi » 2018-07-11 6:45

astolia 写了:
2018-07-07 14:00
与其这在里“应该”这样“应该”那样想当然,你倒是去随便买本linux下c编程的书认真读一下啊。你的想象根本和事实不符。
我觉得你是把管道(pipe)和命名管道(fifo)弄混了。管道确实在内核里有自己的标识符,但这根本不是你的程序需要关心的事。你的程序老老实实从stdin/0里读数据,往stdout/1里写数据就完了,shell自然会帮你处理好其他的事务
stdin/:0,stdout/:1,stderr/:2 只不过是系统的设计者通过shell留给编程者的一个统一的接口,如果我们不喜欢这个“通讯员”也可以自己直接和系统对话。当然考虑到系统的安全性通常这些内容你不会在书店里找到相关介绍的。在SUSv3基本规范里共定义了1742个接口,光是这些规范就有3700多页,这还只是已经公开的。用C系语言来处理这些问题是绕不开我说的这个基本思路的,无论谁来做,这绝不是想像。你是在故意回避。当然这个问题比较敏感,只能说到这里了。
头像
astolia
论坛版主
帖子: 3153
注册时间: 2008-09-18 13:11
送出感谢: 1 次
接收感谢: 527 次

Re: Linux下如何用c语言获取shell的管道文件描述符?

#6

帖子 astolia » 2018-07-11 11:33

你把shell当成什么东西了。shell也不过是一个普通的用户态应用程序而已,和你自己写的程序没有本质区别。
shell建立管道的方法很简单,直接用pipe()系调用获取两个fd后用dup2()之类的调用分别设置成上一个程序的stdout/1和下一个程序的stdin/0而已,根本不需要你用在管道中的程序来操心。
我10年前学linux下c系统编程,读完 https://book.douban.com/subject/2247991/ 这本书后,花了一个晚上用C从头写出了一个最基本的shell,管道重定向这些都实现了。你有空自己试试就明白是怎么回事了。

至于什么考虑到系统的安全性内容不公开,更是一个大笑话,这种“security through obscurity”的思想早就被扔进垃圾堆了。一个完全开源的系统你还觉得有什么没有公开的?linux现在的内核接口syscall也就三百出头,每个都能在manpage里找到详细说明。
头像
phi
帖子: 15
注册时间: 2014-01-29 23:06
系统: Ub
送出感谢: 2 次
接收感谢: 0

Re: Linux下如何用c语言获取shell的管道文件描述符?

#7

帖子 phi » 2018-07-12 2:22

并不是所有的Linux都是开源的啊。
其实我只是想说,起风的时候无论开源与否都不安全。

每年读读《政府工作报告》我们就能了解这个政府了吗?它的每一个办事机构不是也都在网上能够查到详细的说明吗?再说政府公开做得这么有声有色,即可以主动公开,还可以依申请公开。花一个晚上的时间随便看看《新闻联播》就能获得不少有益的补充。
头像
astolia
论坛版主
帖子: 3153
注册时间: 2008-09-18 13:11
送出感谢: 1 次
接收感谢: 527 次

Re: Linux下如何用c语言获取shell的管道文件描述符?

#8

帖子 astolia » 2018-07-12 11:25

知道错了就别再狡辩了。拿政府工作报告来比较更是可笑。非要比的话,linux的公开程度相当于不光政府的所有文件全部公开,而且每一位政府人员的行动都实时直播。
头像
phi
帖子: 15
注册时间: 2014-01-29 23:06
系统: Ub
送出感谢: 2 次
接收感谢: 0

Re: Linux下如何用c语言获取shell的管道文件描述符?

#9

帖子 phi » 2018-07-12 23:33

我想我已经说得很明白了。该懂的已经懂了,装睡的也无需再去叫醒他。
回复

回到 “Shell脚本”