Как исправить «Ошибку сегментации (образ памяти сбрасывается на диск)» при запуске массива дочерних процессовLinux

Ответить Пред. темаСлед. тема
Anonymous
 Как исправить «Ошибку сегментации (образ памяти сбрасывается на диск)» при запуске массива дочерних процессов

Сообщение Anonymous »

Работа с родительскими и дочерними программами с использованием канала. При вводе 's' в бесконечном цикле while(), где вызываются kill() и read(), я получаю ошибку сегментации (сброс изображения памяти на диск). Запускается дочерняя программа, в ней также есть бесконечный цикл генерации значений полей класса, обработчик сигнала на SIGUSR1 присутствует. В результате программа работает до тех пор, пока не будет введена буква "s"
parent.cpp
#include
#include
#include
#include
#include
#include

using namespace std;

pid_t *childs = NULL;
int childCount = 0;

int main() {
char buff[1024];
int pipe_fd[2];
pipe(pipe_fd);
char input[5];
int child_status, childs_id;
int write_pipe_fd = pipe_fd[1];
int read_pipe_fd = pipe_fd[0];

char arg1[10];
snprintf(arg1, sizeof(arg1), "%d", write_pipe_fd);

pid_t child_pid = fork();
if (child_pid < 0) {
perror("fork() failed");
return 1;
} else if (child_pid == 0) {
childCount++;

// Инициализируем массив childs
childs = (pid_t*)malloc(sizeof(pid_t) * childCount);
if (childs == NULL) {
perror("malloc() failed");
return 1;
}

childs[childCount - 1] = getpid(); // Store the child's process ID
execl("./child", "child", arg1, NULL);
// If execl returns, an error occurred
perror("execl() failed");
return 1;
}
else
{
childs_id = 0; // Set the child ID for later use

while(true)
{
// Read input into a string
string input_str;
getline(cin, input_str);

// Check for 's' or 'e'
if (input_str[0] == 's') {
if (childs_id >= 0) {
kill(childs[childs_id], SIGUSR1);
int bytes_read;
bytes_read = read(read_pipe_fd, buff, sizeof(buff));
printf("%.*s\n\n", bytes_read, buff);
} else {
cout

Подробнее здесь: https://stackoverflow.com/questions/783 ... ning-an-ar
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Linux»