Clone Systemcall Linux

Nandolf

Newbie
Registriert
Nov. 2012
Beiträge
2
Hallo,

Ich tu mich grad sehr schwer mit dem Clonebefehl...
Hab mir zum üben ein kleines Beispielprogramm gemacht:

Code:
#define _GNU_SOURCE
#include <stdio.h>
#include <inttypes.h>
#include <stdlib.h>
#include <sched.h>
#include <stddef.h>
#include <signal.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>

int fkt(){
printf("THREAD!\n");
return 0;
}

int main ()
{
	char *child_stack=(char *)malloc(100);
	int pid=
	clone(fkt,child_stack+100,CLONE_THREAD|CLONE_SIGHAND|SIGCHLD|CLONE_VM,NULL); 
	printf("PID:%d\n",pid);
	printf("JUHUUU BIN BOSS\n");
	if(pid<0) printf("Fehler bei thread anlegen:%s\n",strerror(errno));

	waitpid(pid,NULL,0);
	return 0;
}

Funktioniert aber gar nicht wie ich will.
Bei mehrmaligem ausführen wird selten THREAD! ausgegeben
manchmal doppelt JUHUUU BIN BOSS

woher kommt das? wieso wird nicht immer THREAD! ausgegeben?

Gruß Nandolf
 
Du solltest CLONE_PARENT angeben um die Filedeskriptoren zu vererben.

Außerdem besser ein fprintf(stderr, "bla") - das Buffering in der libc dürfte nicht threadsafe sein.
 
Da ich mit nem händischen Clone jetzt auch noch nicht viel rumgepanscht habe, habe ich einfach mal ein pthread-Beispiel durch strace laufen lassen. Da sieht man u.a. das hier:

Code:
clone([...] flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, [...]) = xxxx

Beispielprogramm war folgendes:
Code:
#include <stdio.h>
#include <pthread.h>

void* fkt(void* arg)
{
  (void)arg;
  fprintf(stderr, "thread\n");
  return NULL;
}

int main()
{
  pthread_t thread;
  pthread_attr_t attr;
  int result;
  void* ret_val;
  pthread_attr_init(&attr);
  pthread_create(&thread, &attr, &fkt, NULL);
  fprintf(stderr, "main\n");
  pthread_join(thread, &ret_val);
  pthread_attr_destroy(&attr);
  return 0;
}

Gebaut mit: gcc -pthread -o test test.c -lrt
Und dann: strace -s 512 ./test
Außer zu Erforschungszwecken kann ich allerdings die händische Benutzung von clone nicht empfehlen, lieber immer mit fork oder pthread_create arbeiten.
 
Zurück
Oben