c clone() - problem ze stosem

0

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);
0

Sam sobie odpowiedziałeś. Stos rośnie od wyższego adresu do niższego, czyli musisz podać adres wierzchołka.

0
lukasz1235_logout napisał(a):

Sam sobie odpowiedziałeś. Stos rośnie od wyższego adresu do niższego, czyli musisz podać adres wierzchołka.

wiem, ale czemu wówczas ten kod działa w trakcie debuggowania?

0

W trakcie debugowania program działa niejako na emulatorze. Różne nieprawidłowe operacje mogą zachowywać się inaczej.

0

Sprawdź czy int toWykonaTylkoDziecko() nie powinno być przypadkiem stdcall.

0
_13th_Dragon napisał(a):

Sprawdź czy int toWykonaTylkoDziecko() nie powinno być przypadkiem stdcall.

A stdcall nie jest specyficzne tylko dla winapi?

Azarien napisał(a):

W trakcie debugowania program działa niejako na emulatorze. Różne nieprawidłowe operacje mogą zachowywać się inaczej.

Fakt, to może być odpowiedź. Tyle że wychodzi na to że przydatność debuggera jest ograniczona w tych przypadkach.

1 użytkowników online, w tym zalogowanych: 0, gości: 1