Note that there are some explanatory texts on larger screens.

plurals
  1. POHow to create a real thread with clone() on Linux?
    text
    copied!<p>I am trying to create a new thread using <a href="http://linux.die.net/man/2/clone" rel="noreferrer">clone()</a>. With the following code (...):</p> <pre><code>#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;unistd.h&gt; #define _SCHED_H 1 #define __USE_GNU 1 #include &lt;bits/sched.h&gt; #define STACK_SIZE 4096 int func(void *arg) { printf("Inside func.\n"); sleep(1); printf("Terminating func...\n"); return 0; } int main() { printf("This process pid: %u\n", getpid()); char status_file[] = "/proc/self/status"; void *child_stack = malloc(STACK_SIZE); int thread_pid; printf("Creating new thread...\n"); thread_pid = clone(&amp;func, child_stack+STACK_SIZE, CLONE_SIGHAND|CLONE_FS|CLONE_VM|CLONE_FILES, NULL); printf("Done! Thread pid: %d\n", thread_pid); FILE *fp = fopen(status_file, "rb"); printf("Looking into %s...\n", status_file); while(1) { char ch = fgetc(fp); if(feof(fp)) break; printf("%c", ch); } fclose(fp); getchar(); return 0; } </code></pre> <p>I get the following:</p> <pre><code>This process pid: 10839 Creating new thread... Done! Thread pid: 10840 Inside func. Looking into /proc/self/status... Name: threadTest02 State: R (running) Tgid: 10839 Pid: 10839 PPid: 4777 TracerPid: 0 Uid: 1000 1000 1000 1000 Gid: 1000 1000 1000 1000 FDSize: 256 Groups: 4 20 24 27 30 46 107 123 124 1000 VmPeak: 4300 kB VmSize: 4300 kB VmLck: 0 kB VmPin: 0 kB VmHWM: 356 kB VmRSS: 356 kB VmData: 188 kB VmStk: 136 kB VmExe: 4 kB VmLib: 1884 kB VmPTE: 32 kB VmSwap: 0 kB Threads: 1 SigQ: 0/22869 SigPnd: 0000000000000000 ShdPnd: 0000000000000000 SigBlk: 0000000000000000 SigIgn: 0000000000000000 SigCgt: 0000000000000000 CapInh: 0000000000000000 CapPrm: 0000000000000000 CapEff: 0000000000000000 CapBnd: ffffffffffffffff Cpus_allowed: 3 Cpus_allowed_list: 0-1 Mems_allowed: 00000000,00000001 Mems_allowed_list: 0 voluntary_ctxt_switches: 1 nonvoluntary_ctxt_switches: 1 Terminating func... </code></pre> <p>So, in short, what does my program do? It creates a new thread with <code>clone</code> and prints its <code>/proc/self/status</code>, so that I can see its status. Since my thread sleeps for 1 second, it is still alive when <code>/proc/self/status</code> is printed.</p> <p>However, there are at least two things that make my thread not behave like a common thread. First, as you could see above, the process' pid is 10839 and my thread's pid is 10840. So, the process and my thread don't have the same pid, as occurs in a common thread. Second, even after my thread was created, the <code>Threads:</code> field of my process' <code>/proc/self/status</code> file is still 1. So, my thread seems not to be recognized as a thread.</p> <p>My question is, what is missing in my code? What do I have to do to make my thread behave like a common thread? Is there any option missing in the third argument of <code>clone</code>?</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload