技术标签: linux 管道交互
我正在尝试使用“使用命名管道的进程间通信简介 - 使用命名管道的全双工通信”,link;特别是fd_server.c(包括如下供参考)Linux C:具有独立读写命名管道的“交互式会话”?
这是我的信息,并编译行:
:~$ cat /etc/issue
Ubuntu 10.04 LTS \n \l
:~$ gcc --version
gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3
:~$ gcc fd_server.c -o fd_server
fd_server.c创建两个命名管道,一个用于读取,一个用于写入。什么人可以做的,就是:在一个终端,运行在服务器和读取(通过cat)其写入管道:
:~$ ./fd_server & 2>/dev/null
[1] 11354
:~$ cat /tmp/np2
,并在另一个,写(使用echo)到服务器的读取管道:
:~$ echo "heeellloooo" > /tmp/np1
回到第一终端,人们可以看到:
:~$ cat /tmp/np2
HEEELLLOOOO
0[1]+ Exit 13 ./fd_server 2> /dev/null
我想什么做的,是让不大不小的“互动”(或“壳”类似的)会议;也就是说,服务器像往常一样运行,但不是运行cat和echo,我想使用类似的屏幕。我的意思是,屏幕可以称为screen /dev/ttyS0 38400,然后它进行一种交互式会话,在终端中键入的内容将传递到/dev/ttyS0,并将其响应写入终端。现在,当然,我不能使用screen,因为在我的情况下,程序有两个单独的节点,并且据我所知,screen只能指一个。
如何在这种情况下实现这种“交互式”会话(使用两个独立的读/写管道)?下面
代码:
#include
#include
#include
#include
#include
#include
//#include /* For name of the named-pipe */
#define NP1 "/tmp/np1"
#define NP2 "/tmp/np2"
#define MAX_BUF_SIZE 255
#include //exit
#include //strlen
int main(int argc, char *argv[])
{
int rdfd, wrfd, ret_val, count, numread;
char buf[MAX_BUF_SIZE];
/* Create the first named - pipe */
ret_val = mkfifo(NP1, 0666);
if ((ret_val == -1) && (errno != EEXIST)) {
perror("Error creating the named pipe");
exit (1);
}
ret_val = mkfifo(NP2, 0666);
if ((ret_val == -1) && (errno != EEXIST)) {
perror("Error creating the named pipe");
exit (1);
}
/* Open the first named pipe for reading */
rdfd = open(NP1, O_RDONLY);
/* Open the second named pipe for writing */
wrfd = open(NP2, O_WRONLY);
/* Read from the first pipe */
numread = read(rdfd, buf, MAX_BUF_SIZE);
buf[numread] = '0';
fprintf(stderr, "Full Duplex Server : Read From the pipe : %sn", buf);
/* Convert to the string to upper case */
count = 0;
while (count < numread) {
buf[count] = toupper(buf[count]);
count++;
}
/*
* Write the converted string back to the second
* pipe
*/
write(wrfd, buf, strlen(buf));
}
编辑:
权,只是为了澄清 - 看来我发现了一个document讨论非常类似的东西,它是 - 脚本的修改有(” 对于例如,下面的脚本配置设备并启动一个后台进程,将从串行设备接收到的所有数据复制到标准输出...“)为以下程序:
# stty raw #
(./fd_server 2>/dev/null;)&
bgPidS=$!
(cat < /tmp/np2 ;)&
bgPid=$!
# Read commands from user, send them to device
echo $(kill -0 $bgPidS 2>/dev/null ; echo $?)
while [ "$(kill -0 $bgPidS 2>/dev/null ; echo $?)" -eq "0" ] && read cmd; do
# redirect debug msgs to stderr, as here we're redirected to /tmp/np1
echo "$? - $bgPidS - $bgPid" >&2
echo "$cmd"
echo -e "\nproc: $(kill -0 $bgPidS 2>/dev/null ; echo $?)" >&2
done >/tmp/np1
echo OUT
# Terminate background read process - if they still exist
if [ "$(kill -0 $bgPid 2>/dev/null ; echo $?)" -eq "0" ] ;
then
kill $bgPid
fi
if [ "$(kill -0 $bgPidS 2>/dev/null ; echo $?)" -eq "0" ] ;
then
kill $bgPidS
fi
# stty cooked
所以,保存脚本说starter.sh和调用它,与下一届会议的结果:
$ ./starter.sh
0
i'm typing here and pressing [enter] at end
0 - 13496 - 13497
I'M TYPING HERE AND PRESSING [ENTER] AT END
0~�.N=�(�~� �����}����@������~� [garble]
proc: 0
OUT
这是我会叫“交互会话”(忽略调试语句) - 服务器等待我输入命令;它在接收到一个命令后给出它的输出(在这种情况下,它在第一个命令之后退出,起始脚本也一样)。除此之外,我想没有缓冲输入,但逐字发送(这意味着上面的会话应该在第一次按键后退出,并且只打印出单个字母 - 这是我期望raw有帮助,但它不是:它只是杀死反应既输入和按Ctrl - ç :))
我只是游荡,如果已经有一个现有的命令(对于串行设备类似于screen,我猜)会接受两个这样的命名管道作为参数,并通过它们建立像会话那样的“终端”或“shell”;或者我将不得不使用上面的脚本和/或编程自己的“客户端”,它将起到终端的作用。
2010-05-06
sdaau
+0
使用Ctrl + K将代码缩进四个空格,这将创建一个语法高亮的代码块。我为你做了,停止编辑。 ;-) –
2010-05-06 13:12:45
+0
谢谢,约翰Kugelman,建议和编辑:) –
2010-05-06 13:18:13
文章浏览阅读2.5k次。1.为什么要登录百度?答:因为目前百度在中文搜索领域居绝对领先地位,每天有超过6000万人次访问和使用百度搜索,是全球最多中文用户喜欢选用的搜索引擎。2.怎样登录百度? 答:只要在这里http://www.baidu.com/search/url_submit.html 提交您的网址即可。3.登录百度收费吗? 答:登录百度是免费的。4.为什么在百度中搜索不到我的网站? 答:可能的原因如下..._让百度通过中文可以找到网页
文章浏览阅读1.5k次。DescriptionMr. Hdu is an painter, as we all know, painters need ideas to innovate , one day, he got stuck in rut and the ideas dry up, he took out a drawing board and began to draw casually. Imagine the board is a rectangle, consists of several square gri_substance painter出现格子
文章浏览阅读9.9k次,点赞2次,收藏9次。很郁闷的问题如下: function jsAlert() { var testNumber = 2; $.ajax({ type: "post", url: "JsonCode/GetResult.ashx", succes_$.ajax({ async为true取不到值
文章浏览阅读95次。双击“删除文件”按钮添加响应函数OnDelete(),在响应函数OnDelete()中添加一下代码:void CDeleteCertainFolderFileDlg::OnDelete(){UpdateData(true);CString m_extern;switch (m_radio)//获取要删除文件类型的后缀名{case 0:GetDlgItem(IDC_RADIO1)->GetWi..._mfc 指定行 mysql 删除
文章浏览阅读3.7k次,点赞2次,收藏9次。第一步:在CentOS中安装docker引擎要安装Docker引擎,需要CentOS 7或CentOS 8的维护版本。查看CentOs版本:cat /etc/redhat-release使用仓库安装的方法:设置仓库安装yum-utils包(提供了yum-config-manager工具)并启动一个稳定的仓库 sudo yum install -y yum-utils sudo yum-config-manager \ --add-repo \ https://downl_navicate 查看 docker 数据库
文章浏览阅读445次。经常会出现很多none的镜像,一看就不爽,一条命令搞定docker images | grep none | awk '{print $3}'_在docker容器中“centos ” 这个镜像删除不了
文章浏览阅读3.4k次。该属性可以接受多个值,包括关键字(如top、middle、bottom),长度单位(如像素、百分比)或百分比值的关键字(如baseline、sub、super)。是一个CSS属性,用于指定行内元素或表格单元格中内容的垂直对齐方式。它可以应用于行内元素、表格单元格或表格单元格中的内容。属性也可以接受长度单位(如像素)或百分比值。这些值用于指定元素相对于行框的偏移量。如果要垂直对齐块级元素,可以使用其他技术,如Flexbox或Grid布局。标签的行内元素将垂直居中对齐,而表格单元格中的内容将顶部对齐。_vertical-align属性
文章浏览阅读1.5k次,点赞2次,收藏18次。一、HTTPS握手公钥私钥非对称加密解密原理以及数字证书由来。(1) HTTPS协议=HTTP协议+SSL协议,默认端口:443(2) HTTP协议(HyperText Transfer Protocol):超文本传输协议。默认端口:80,其中包含请求和响应两部分,其中请求包含:请求行、请求头、请求正文,响应包含:响应行、响应头、响应正文。(3) SSL协议(Secure Socket Layer) 安全套接层:为NetScape所研发,用以保障在Internet上数据传输的安全,利用数据加密技_报文抓取
文章浏览阅读3.5k次。今天小蚁君来讲一下选择阿里云高防IP和机房高防IP的人群都是一个什么样的心态呢?阿里云高防IP我们从价格定位上来看就知道,阿里云的高防很明显,需要一点实力才能够用的起的,但是不可否认在大众对于高防IP没多少认知的时候还是喜欢去“旗舰店”买的,但是这个不像购买数码产品,因为在很大程度来说,机房才是高防IP的一手资源,因为高防IP的基础就是机房去做的,那么为什么大家对阿里云高防IP又爱又恨的原因是什么呢?因为啊,阿里云的高防IP在业内被称之为吞金兽,只要是你的账户上有钱,那么你的防护就不会死,._阿里云高防ip是个集群吗
文章浏览阅读6.8k次,点赞4次,收藏11次。一、修改已经存在的索引最观的解决方案是首先备份该索引中已经存在的数据,然后删除它再重建该索引。这种方式比较暴力,当索引中已经存在相当多的数据时,不建议这样做。另外一种方案是使用_open和_close这一对端点,首先将目标索引关闭,执行需要的更新操作,然后再打开该索引。POST /symbol/_closePUT /symbol/_settings{ "settings": { ..._restful elasticsearch reindexrequest如何设置重命名字段
文章浏览阅读837次。select*froma,b,c,dLEFTJOINeone.id=a.idleftjoinfonf.id=c.id现在这句是错的,怎么写才正确...sql中left join from 多个表具体代码如下:SELECT r.roleid,r.rolename,r.deptid,d.deptname,GROUP_CONCAT(m.menuname SEPARATOR ',' ) menunam..._from多个表left join怎么写
文章浏览阅读437次。Object.assign剖析:方法含义:浅层次的完成对象的拷贝工作,拷贝源对象的第一层属性和第一层引用方法使用Object(目标对象,源对象1,源对象2,…)方法原理步骤:1.判断对象是否存在assign方法,没有就直接赋值给对象一个assign方法2.判断目标源对象是否为空,为空则抛出错误,程序完毕3.遍历源对象,拿出可枚举属性赋值给新对象4.返回新对象代码实现if(typeofObject.assign!=='function'){..._object.assign的缺点