解决Linux进程间通过管道通信乱码的问题

一段进程间管道通信代码如下图所示:

先来了解一下乱码的原因,字符在计算机中都是通过ascll码表示的,有些ascll码表示确定的字符,比如65表示大写字母'A',97表示小写字母'a',48表示数字'0',而有一些ascll码表示一些其他字符,这些其他字符就是造成乱码的原因。起初声明一个字符数组,该字符数组的每个元素都是不确定的,也就是ascll码是随机的,读到这些字符然后显示,就成为了屏幕上的乱码。

在C语言中,从字符数组中读字符是读到'\0'就结束的,我们可以将声明的字符数组都使用memset函数初始化一遍,'\0'的ascll码是0,所以我们加上memset(outpipe,0,sizeof(outpipe))、memset(inpipe,0,sizeof(inpipe)即可。

还有一种乱码是inpipe数组开小了造成的,比如inpipe开了15个字节,而从管道中读出了20个字节,这时UNIX内核会将读出的20个字节转储到内存的其他地方,导致读完整了本来想要读出的内容,但是后面跟着一堆乱码。系统也提示“已放弃(核心已转储)”。如下图所示:

这种乱码的解决方案就是将inpipe数组开的大一点。 

发布了72 篇原创文章 · 获赞 203 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/weixin_41676881/article/details/102890516