__clone에 관련한 질문입니다.

li2th의 이미지

posix lib가 없는 환경에서 작업을 하게 되었습니다.
__clone이 있으니 상관이 없겠지 라고 생각했는데 있는건 오랬동안 알았지만 막상 처음 사용하는것이라 많이 생소합니다.(-_-;)
int __clone(int (*fn) (void *arg), void *child_stack, int flags, void *arg)
의 파라메터 중에서 void *child_stack 이걸 어떻게 해야할지 좀 감이 않옵니다.
pthread에서 스텍사이즈를 지정하는 것 처럼 원하는 크기의 메모리공간을 만들어서 주면 되겠지 싶어서 일단은 아래와 같이 해서 작업을 하였습니다.

int threadkick(void *arg);
struct argu{
int flags;
char *name;
}
...대충 줄입니다.
struct argu *param;
void *temp;

param = (struct argu *)malloc(size_of(struct argu));
temp = malloc(sizeof(char)*4096);

ret = __clone(threadkick, temp, CLONE_VM, param);

컴파일이나 동작시 에러 발생은 안하는데 파레메터로 전달한 함수포인터가 동작을 하지 않는군요. (변수선언 이후에 단순한 출력문으로 체크하였습니다만 감감 무소식이군요.)

__clone을 포함한 단순한 예제나 아니면 정확한 호출형식을 알 수 있었으면 합니다.(다른 부분들은 필요없고, __clone의 파라메터로 쓰인 함수포인터 proto type과, __clone을 포함한 한 줄이면 됩니다.)

부탁드리겠습니다. 수고하십시요.

송지석의 이미지

#include<sched.h>

int child_func(void* arg)
{
    printf("start of child\n");
    return 0;
}
int main()
{
    int ret;
    char child_stack[1024];
    printf("start of main\n");
    ret= __clone( child_func, child_stack, NULL, NULL);
    printf("return =%d\n", ret);
    sleep(1);
    return 0;
}

관심이 생겨서 저도 한번 해봤는데요..

스택을 그냥 부모 스택 안에 잡아버렸는데 일단 실행은 되는군요..

Quote:
[rommance@localhost clonetest]$ ./a.out
start of main
return =24640
start of child

스택의 방향까지는 계산해보지 않아서 정확히 쓴지는 모르겠지만.. 어쨌든 이렇네요. ^_^
void* child_stack= malloc(1024); 이렇게 힙에 잡으니
start of main
return =24652
Segmentation fault
에러가 나고요..
char child_stack[1024]; 를 함수 밖으로 빼서 global로 만들고 해보니 에러는 안나지만
start of main
return =24661
프린트가 안되는군요.
li2th의 이미지

일단은 그렇게 작업을 하고 있어야 겠군요^^;

또한 다시한번 정확한 사용법을 알고 계신분이 있다면 알려주시길 부탁드리겠습니다.

수고하십시요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.