Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
5 / 5 / 3
Регистрация: 20.10.2013
Сообщений: 68

Ошибка сегментации (core dumped)

18.04.2015, 14:49. Показов 1620. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть программа, реализующая неименованный программный канал.
Первый процесс передает процессу count строки, а count считает количество символов в них.
Канал p передает в count текст, q передает обратно.
После передачи первой строки возникает ошибка сегментации, я почитал про это и понял, что как-то неправильно обращаюсь к памяти, но где не вижу.
Так что буду благодарен за любые наводки.

Вот текст самой программы:
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 
#define R 0
#define W 1
#define TRUE 1
#define FALSE 0
#define PERIOD '.'
 
int main()
{
  int pid;
  int p[2], q[2];
  FILE *fdopen(), *fp;
  int c;
  int newline = TRUE;
  int total;
  /* Set program canals p and q */
  pipe(p);
  pipe(q);
  /* p[R], q[R] - for reading */
  /* p[W], q[W] - fow writing */
  switch (pid = fork())
  {
    case 0: /* SON */
      /* reads from p[R]
         writes to q[W]
         p[W] and q[R] - closed
         stdin and p[R] - sinonims
         stdout and q[W] - sinonims */
      /* canal p */
      close(p[W]);
      close(R);dup(p[R]);close(p[R]);
      /* now stdin and q[W] are sinonims */
      /* canal q */
      close(q[R]);
      close(W);dup(q[W]);close(q[W]);
      /* now stdout and q[W] are sinonims */
      /* launch count */
      execl("count", "count", 0);
      printf("textcount: error while calling count.\n");
      exit(1);
    case -1: /* fork() error */
      printf("Error while calling fork().\n");
      exit(1);
    default: /* FATHER */
      close(p[R]);close(q[W]);
 
      fp = fdopen(p[W], "W");
      /* sending textfile to count */
      while ((c = getchar()) != EOF)
      {
        switch (newline)
        {
          case TRUE:
            if (c == '\n')
              putc(c, fp);
            else if (c == PERIOD)
              while ((c = getchar()) != EOF && c != '\n');
            else
            {
              putc(c, fp);
              newline = FALSE;
            }
            break;
          default:
            putc(c, fp);
            if (c == '\n')
              newline = TRUE;
        }
      }
      fclose(fp); /* to make receiving process unable to percieve EOF on the end
                      of reading canal */
      /* now connecting input form cana q and reading result*/
      close(R);dup(q[R]); close(q[R]);
      scanf("%d", &total);
      printf("Total number of symbols: %d", total);
      exit(0);
  }
}

А вот текст count (тут ничего особенного, просто на всякий случай):
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
#include <stdio.h>
 
int main()
{
  int count = 0;
  while (getchar() != EOF)
    count++;
  printf("%d\n", count);
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.04.2015, 14:49
Ответы с готовыми решениями:

Ошибка сегментирования (core dumped)
Такая проблема: при запуске программы, выдает ошибку &quot;Ошибка сегментирования (core dumped)&quot; Вот код #include &lt;stdio.h&gt; ...

Ошибка Segmentation fault (Core dumped)
Как избавится от ошибки Segmentation fault? Core dumped! на линукс, я предполагаю что это связано с выделениям памяти. #include...

Связать Си и ассемблер: Ошибка сегментирования (core dumped)
Здравствуйте помогите разобраться почему не работает... пишет Ошибка сегментирования (core dumped) #include &lt;stdio.h&gt; ...

2
599 / 421 / 136
Регистрация: 02.10.2008
Сообщений: 1,796
Записей в блоге: 1
19.04.2015, 20:41
Цитата Сообщение от galayko Посмотреть сообщение
FILE *fdopen(), *fp;
WTF?
0
5 / 5 / 3
Регистрация: 20.10.2013
Сообщений: 68
21.04.2015, 20:14  [ТС]
Переписал код с нуля.
Строки корректно передаются дочернему процессу по трубе p, а обратно по трубе q передаваться не хотят.
Опять core dumped, не понимаю, в чем проблема.
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <stdlib.h>
 
#define R 0
#define W 1
#define MAX_LENGTH 128
#define MAX_NUMBER 81
 
int main()
{
  int p[2], q[2];
  pid_t pid;
  char string[MAX_NUMBER][MAX_LENGTH];
  char buf[MAX_LENGTH];
  int n;
 
  pipe(p);
  pipe(q);
 
  switch (pid = fork())
  {
    case -1:
      perror("Error while calling fork");
      exit(1);
    case 0: /* CHILD */
      read(p[R], string, sizeof(string));
      /* filter2 */
      n = 0;
      do
      {
        for (int j = 0; j < strlen(string[n]); j++) //upper
          string[n][j] = toupper(string[n][j]);
        n++;
      }
      while (strcmp(string[n - 1], "\0"));
      /* end of filter2 */
 
      write(q[W], string, sizeof(string));
 
      exit(0);
    default: /* PARENT */
      printf("Input strings to transfer:\n");
      /* filter1 */
      n = 0;
      do //read
      {
        fgets(string[n], sizeof(string[n]), stdin);
        for (int j = strlen(string[n]) + 3; j > 2; j--)
          string[n][j] = string[n][j - 3];
        n++;
      }
      while (n < MAX_NUMBER && strcmp(string[n-1], "\n"));
 
      for (int i = 0; i < n - 1; i++) //mark
      {
        string[i][0] = i + 1 + '0';
        string[i][1] = ':';
        string[i][2] = ' ';
      }
      /* end of filter1 */
      write(p[W], string, sizeof(string));
 
      read(q[R], buf, sizeof(buf));
 
      for (n = 0; strcmp(buf[n], "\0"); n++)
        printf("%s", buf[n]);
  }
  return(0);
}


Добавлено через 8 часов 6 минут
Вот, доделал если кому надо.
Но тут немного мухлюю, теряется первый символ в строках при передаче.

Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <stdlib.h>
#include <sys/ioctl.h>
 
#define R 0
#define W 1
#define MAX_LENGTH 128
#define MAX_NUMBER 81
 
int main()
{
  int p[2], q[2];
  pid_t pid;
  char string[MAX_NUMBER][MAX_LENGTH];
  char buf[MAX_NUMBER][MAX_LENGTH];
  int n;
 
  pipe(p);
  pipe(q);
 
  switch (pid = fork())
  {
    case -1:
      perror("Error while calling fork");
      exit(1);
    case 0: /* CHILD */
      read(p[R], string, sizeof(string));
      /* filter2 */
      n = 0;
      do
      {
        for (int j = 0; j < strlen(string[n]); j++) //upper
          string[n][j] = toupper(string[n][j]);
        n++;
      }
      while (strcmp(string[n - 1], "\0"));
      /* end of filter2 */
 
      write(q[W], string, sizeof(string));
 
      exit(0);
    default: /* PARENT */
      /* filter1 */
      n = 0;
      do //read
      {
        fgets(string[n], sizeof(string[n]), stdin);
        for (int j = strlen(string[n]) + 3; j > 2; j--)
          string[n][j] = string[n][j - 3];
        n++;
      }
      while (n < MAX_NUMBER && strcmp(string[n-1], "\n"));
 
      for (int i = 0; i < n - 1; i++) //mark
      {
        string[i][0] = i + 1 + '0';
        string[i][1] = ':';
        string[i][2] = ' ';
      }
      /* end of filter1 */
      write(p[W], string, sizeof(string));
 
      //reading from q until we can do it
      int count = 0;
      char byte = 0;
 
      while (read(q[R], &byte, 1) == 1)
        if (ioctl(q[R], FIONREAD, &count) != -1)
        {
          if (read(q[R], buf, count) == count)
            for (n = 0; strcmp(buf[n], "\0"); n++)
              printf("%d%s", n + 1, buf[n]);
          exit(0);
        }
        else
        {
          perror("Failed to read input size.");
        }
  }
  return(0);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.04.2015, 20:14
Помогаю со студенческими работами здесь

Перезаписать все строки, короче i из одного файла в другой и ошибка "Segmentation fault (core dumped)"
Программа перезаписывает все строки, короче i из одного файла в другой. При запуске появляется Segmentation fault (core dumped). В чем...

Segmentation fault (core dumped)
Собрал исходники Собралось без ошибок скрин https://cloud.mail.ru/public/BR4P/9wyzETEnW Но при попытке запуска пишет это...

Метаданные файла Segmentation Fault (core dumped)
Всем привет, совсем недавно начал изучать Linux и не пойму в чем дело....подскажите пожалуйста: #include &lt;fcntl.h&gt; #include...

ошибка сегментации
выдаёт ошибку сегментации #include&lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;string.h&gt; #include &lt;signal.h&gt; #include&lt;dirent.h&gt;...

Ошибка сегментации программы
Приветствую. Во время работы опенсорсной софтины (под FreeBSD &gt;=8.2 x64) её дочерний процесс с течением небольшого времени падает в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru