Я работаю над проблемой домашней работы, чтобы написать реализацию гипотезы collatz в C, используя fork() и объект общей памяти, выполняя вычисления в дочернем процессе и распечатывая результаты в родительском , Я не очень хорошо знаком с C, поэтому я многому научился. Используя gdb, я обнаружил segfault, когда пытаюсь получить доступ к объекту в родительском процессе. Я использую Вот мой код:Чтение Segfault из общей памяти
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/mman.h>
#include <math.h>
int main(int argc, const char* argv[])
{
const int SIZE = 4096;
const char *name = "SM";
int shm_fd;
void *ptr;
pid_t child;
if ((argc != 2) || (strtol(argv[1],NULL, 10) <= 0))
{
printf("Invalid usage: requires 1 positive integer parameter\n");
return -1;
}
child = fork();
if(child >=0)
{
if (child == 0)
{
shm_fd = shm_open(name, O_CREAT || O_RDWR, 0666);
ftruncate(shm_fd, SIZE);
ptr = mmap(0, SIZE, PROT_WRITE, MAP_SHARED, shm_fd, 0);
int currentval = strtol(argv[1],NULL,10);
sprintf(ptr,"%d",currentval);
ptr++;/* floor(log10(abs(currentval))) + 1;*/
while (currentval > 1)
{
sprintf(ptr, ", ");
ptr += 2;
if (currentval % 2 == 1)
{
currentval = currentval * 3 + 1;
sprintf(ptr, "%d", currentval);
ptr++;
}
else
{
currentval = currentval/2;
sprintf(ptr, "%d", currentval);
ptr++;
}
}
sprintf(ptr, "\n");
ptr+= 1;
return 0;
}
else
{
wait();
shm_fd = shm_open(name, O_RDONLY, 0666);
ptr = mmap(0, SIZE, PROT_READ, MAP_SHARED, shm_fd, 0);
printf("%s\n",(char *)ptr);
shm_unlink(name);
return 0;
}
}
else
{
printf("error creating child process\n");
}
return 0;
}
Я никогда не отлажен на Segfault раньше, поэтому любой совет будет приветствовать. Заранее спасибо.
Я думаю, причина может заключаться в том, что ваш mmap может быть неисправен. Вы используете указатель, даже не проверяя условия ошибки. mmap при ошибке возвращает «-1» и устанавливает номер ошибки. – wabbit
Я получаю два основных файла, когда я делаю дамп. Ребенок: '0 0x00832f25 в _IO_str_overflow_internal() из /lib/tls/libc.so.6 # 1 0x00831abf в _IO_default_xsputn_internal() из /lib/tls/libc.so.6 # 2 0x0080c4e8 в vfprintf() из /lib/tls/libc.so.6 # 3 0x00827b1b in vsprintf() из /lib/tls/libc.so.6 # 4 0x00814e3b в sprintf() из /lib/tls/libc.so.6 # 5 0x0804865d в main (argc = 2, argv = 0xbfea2e84) at problem_3_21.c: 42' – user2829815
bt от родителя: '# 0 0x0083c26b в strlen() из /lib/tls/libc.so.6 # 1 0x0080f821 в vfprintf() из /lib/tls/libc.so.6 # 2 0x00814dc0 в printf() из /lib/tls/libc.so.6 # 3 0x08048748 в main (argc = 2, argv = 0xbfea2e84) at problem_3_21.c: 68 ' – user2829815