今天在写父子进程用两个单向管道通信时,出现了错误:

Segmentation fault (core dumped)

打开core文件发现:

附上源码:

1 #include

2 #include

3 #include

4 #include

5 #include

6 #include

7

8 void erreur(const char *msg)9 {10 perror(msg);11 }12

13 #define NBCAR 256

14

15 int main(void)16 {17 pid_t pid;18 int tube[2];19 int tube2[2];20 intret_out, ret_in;21 char *buffer,*buffer2;22

23 if (pipe(tube) == -1) {//from parent to son

24 erreur("Erreur de creation du pipe");25 exit(EXIT_FAILURE);26 }27 if (pipe(tube2) == -1) {//from son to parent

28 erreur("Erreur de creation du pipe");29 exit(EXIT_FAILURE);30 }31 buffer = (char *) malloc(NBCAR * sizeof(char));32 buffer2 = (char *) malloc(NBCAR * sizeof(char));33 switch (pid =fork()) {34 case (pid_t) -1:35 erreur("fork");36 case (pid_t) 0:37 close(tube[1]);38 close(tube2[0]);39 if (printf("Je suis le fils de PID %d\n write dans le tube : %s\n Nbr Caracteres lus: %d\n",getpid(), buffer, ret_in =write(tube2[1], buffer="tube1 s to p", NBCAR - 1)) == -1) {40 erreur("Pb Lecture");41 exit(EXIT_FAILURE);42 }43 if (printf("Je suis le fils de PID %d\n Lecture dans le tube : %s\n Nbr Caracteres lus: %d\n",getpid(), buffer2, ret_in =read(tube[0], buffer2, NBCAR - 1)) == -1) {44 erreur("Pb Lecture");45 exit(EXIT_FAILURE);46 }47

48 exit(0);49 break;50 default:51 close(tube[0]);52 close(tube2[1]);53 if (printf("Je suis le parent de PID %d\n Lecture dans le tube : %s\n Nbr Caracteres lus: %d\n",getpid(), buffer, ret_in =read(tube2[0], buffer, NBCAR - 1)) == -1) {54 erreur("Pb Lecture");55 exit(EXIT_FAILURE);}56 if (printf("Je suis le parent de PID %d\n write dans le tube : %s\n Nbr Caracteres lus: %d\n",getpid(), buffer2, ret_in =write(tube[1], buffer2="tube2 p to s", NBCAR - 1)) == -1) {57 erreur("Pb Lecture");58 exit(EXIT_FAILURE);}59

60 wait(NULL);61 break;62

63 }64 free(buffer);65 free(buffer2);66 returnEXIT_SUCCESS;67 }

关于SIGSEGV错误

SIGSEGV --- Segment Fault. The possible cases of your encountering this error are:

1.buffer overflow --- usually caused by a pointer reference out of range.

2.stack overflow --- please keep in mind that the default stack size is 8192K.

3.illegal file access --- file operations are forbidden on our judge system.

后来通过邮件问老师,发现是buffer出现内存泄漏。

先梳理一下C语言中char和字符型、字符串型、单引号、双引号、字符串截止符号的概念:

首先C中没有专门的字符串变量(没有C++中的String类),单个的char就代表一个字符,赋值时应该是:char c = 'a'; 故而单引号表示单个字符。如果用char表示字符串,需要定义char的数组,并有两种主要赋值方法:

char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};char greeting[] = "Hello";//第二例子

char c[10]={'I', ' ', 'a', 'm', ' ', 'h', 'a', 'p', 'p', 'y'};char c[]="I am happy";

第一种方法:若初值个数小于数组长度,则只将这些字符赋绐数组中前面的元素,其余元素自动定为空字符(即'\0')。

第二种方法:编译器会在初始化数组时,自动把 '\0' 放在字符串的末尾。

回过头看代码中对buffer的操作:

对buffer和buffer2都分配了256个字节的空间(注意他们是指针,指向256个字节连续空间的首地址),但在赋值时直接对buffer使用等号=,把常量字符串赋给一个指针本身,这显然是不对的····原来分配的两块256字节的内存现在没有指针指向了,最后free的时候并不能把他们释放掉,因此造成内存泄漏

但write()和read()中间参数又必须是指针,这时就需要strcpy()函数,改成:

buffer=strcpy(buffer,"tube1 s to p")

buffer2=strcpy(buffer2,"tube2 p to s")

完美运行,不会报错

借此机会再复习一下char字符串用等号=赋值和用strcpy()赋值的区别:

等号赋值,两个char指向同一个空间

函数赋值,两个char各有一个相同的字符串拷贝

本文完

参考:

SIGSEGV错误

关于core dumped

linux strcpy 用法,由Linux中管道的buffer,浅谈C语言中char类型字符串拷贝使用strcpy()和=赋值符号的区别...相关推荐

  1. c语言中管道符作用,由Linux中管道的buffer,浅谈C语言中char类型字符串拷贝使用strcpy()和=赋值符号的区别...

    今天在写父子进程用两个单向管道通信时,出现了错误: Segmentation fault (core dumped) 打开core文件发现: 附上源码: 1 #include 2 #include 3 ...

  2. c语言 strcpy原型,浅谈C语言中strcpy,strcmp,strlen,strcat函数原型

    实例如下: //strcat(dest,src)把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0' char *strcat(char * strDest, cons ...

  3. 在c语言中 char型数据在内存中的存储形式是,在c语言中char型数据在内存中的存储形式是什么?...

    在c语言中char型数据在内存中的存储形式是ASCII码.在C语言中,char型数据是将一个字符常量放到一个字符变量中,并不是把该字符本身放到内存单元中去,而是将该字符的相应的ASCII代码放到存储单 ...

  4. c语言中 char怎样用,C语言中char*和char[]用法区别分析

    C语言中char*和char[]用法区别分析 本文实例分析了C语言中char* 和 char []的区别.分享给大家供大家参考之用.具体分析如下: 一般来说,很多人会觉得这两个定义效果一样,其实差别很 ...

  5. C语言中char*和char[]用法区别分析

    本文实例分析了C语言中char * 和 char []的区别.分享给大家供大家参考之用.具体分析如下: 一般来说,很多人会觉得这两个定义效果一样,其实差别很大.以下是个人的一些看法,有不正确的地方望指 ...

  6. C/C++中Static的作用详述 在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。

    C/C++中Static的作用详述 在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条. (1)先来介绍它的第一条也是最重要的一条:隐藏. 当我们同时编译多个文件时,所有未加s ...

  7. c语言控制字符的作用是什么意思,c语言中char的用法是什么意思

    C语言是计算机软件领域非常经典的编程语言,C语言中char的作用有哪些你了解吗.下面学习啦小编就跟你们详细介绍下c语言中char的用法,希望对你们有用. c语言中char的用法:c语言中char的用法 ...

  8. Go 语言中 switch 类型断言用法

    Author mogd 2022-05-09 Update mogd 2022-05-09 Adage Don't live in the past. 目录 Go 语言中 switch 类型断言的用法 ...

  9. 在c语言中char型数据在内存中的储存形式为什么

    在c语言中char型数据在内存中的储存形式为"ASCII码".在C语言中,将一个字符常量放到一个字符变量中,实际并不是把该字符本身放到内存单元中,而是将与该字符相对应的ASCII码 ...

最新文章

  1. DFT - Introduction to Test Models
  2. 用c语言编程矩阵乘法,c语言矩阵相乘
  3. python列表间隔合并_Python使用zip合并相邻列表项的方法示例
  4. userscript.user.js 文件头
  5. 2011年计算机一级考试题,2011年计算机一级考试试题及答案
  6. Java类、实例的初始化顺序
  7. LeetCode刷题(36)--Text Justification
  8. Tkinter Frame size
  9. Farthest sampling on 3d mesh with mesh kept
  10. php 按行读取并分割字符串
  11. YDOOK:Maxwell 电磁场仿真 最新版的 Maxwell 软件 使用什么软件进行电磁场仿真
  12. 银行固定资产管理系统盘点方案
  13. comsol学习中心:建模工作流程
  14. eureka服务下架、服务续期及eureka源码分析
  15. vb.net打砖块游戏
  16. 商业需求响应管理系统行业调研报告 - 市场现状分析与发展前景预测
  17. 如何从Lytro 相机中获取图像阵列
  18. 深圳学区房购买-查查吧深圳学区房地图
  19. 搭建SNS游戏服务器
  20. 博客搬家 pjblog 到 z-blog

热门文章

  1. 开发一次、多端覆盖的开源统一框架
  2. Java 18 都要来了,你不会还在用Java 8吧?
  3. 趣解面试高频算法难题:数组中的第K个最大元素
  4. Spring Boot 优雅停止服务的几种方法
  5. 什么是充血模型?什么又是贫血模型?
  6. VS Code的7个开源替代品
  7. 如何干掉恶心的 SQL 注入?
  8. Java 8 Stream Api 中的 skip 和 limit 操作
  9. 配置访问oracle_SpringBoot中application.properties的常用配置
  10. java grizzly_java grizzly实现http服务器