Witam
przejdę od razu do konkretów:
#include <sched.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#define STACK_SIZE 8096
int clone_ret_val;
int kontrolka;
int toWykonaTylkoDziecko()
{
printf("Wchodzę do funkcji\n");
printf("jestem dzieckiem, mój PID to %d, PID rodzica to %d\n", getpid(), getppid());
kontrolka=1;
return 0;
}
int main (int argc, char* argv[])
{
kontrolka=0;
void *stack;
stack = malloc(STACK_SIZE);
if (!stack)
{
perror("Błąd alokacji pamięci.\n");
return EXIT_FAILURE;
}
printf ("Jestem w main\n");
clone_ret_val=clone(toWykonaTylkoDziecko, stack, SIGCHLD | CLONE_VM, NULL);
if (clone_ret_val==-1)
{
perror("Nie mogłem utworzyć procesu potomnego\n");
return EXIT_FAILURE;
}
sleep(1);
printf ("Znów jestem w main, mój PID to %d, więc jestem rodzicem. PID mojego dziecka to %d\n", getpid(), clone_ret_val);
printf ("Kontrolka: %d\n", kontrolka);
return EXIT_SUCCESS;
}
problem brzmi:
Jestem w main
Naruszenie ochrony pamięci
co ciekawe, gdy uruchamiam ten sam program w gdb dostaję
(gdb) run
Starting program: /home/wojtek/Dokumenty/stosowana/2 rok/systemy/cw10/2
Jestem w main
Wchodzę do funkcji
jestem dzieckiem, mój PID to 6629, PID rodzica to 6626
Znów jestem w main, mój PID to 6626, więc jestem rodzicem. PID mojego dziecka to 6629
Kontrolka: 1
[Inferior 1 (process 6626) exited normally]
więc niby wszystko OK. Moje pytanie brzmi czemu badając program debuggerem wychodzi na to ze wszystko jest ok, a próbujac go uruchomić normalnie dostaję segfaulta? Segfault nie występuję jeśli wysyłając do funkcji przesunę wskaźnik stack:
clone_ret_val=clone(toWykonaTylkoDziecko, stack+STACK_SIZE, SIGCHLD | CLONE_VM, NULL);