Как исправить «Ошибку сегментации (образ памяти сбрасывается на диск)» при запуске массива дочерних процессов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

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