2013-04-07 21 views
5

Tôi đang cố tạo chủ đề mới bằng cách sử dụng clone(). Với đoạn mã sau (...):Làm thế nào để tạo một chuỗi thực với clone() trên Linux?

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

#define _SCHED_H 1 
#define __USE_GNU 1 
#include <bits/sched.h> 

#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(&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; 
} 

tôi nhận được như sau:

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... 

Vì vậy, trong ngắn hạn, những gì chương trình của tôi làm gì? Nó tạo ra một chủ đề mới với clone và in /proc/self/status của nó, để tôi có thể thấy trạng thái của nó. Kể từ khi thread của tôi ngủ trong 1 giây, nó vẫn còn sống khi /proc/self/status được in.

Tuy nhiên, có ít nhất hai điều khiến luồng của tôi không hoạt động giống như một chuỗi chung. Đầu tiên, như bạn có thể thấy ở trên, quá trình 'pid là 10839 và pid thread của tôi là 10840. Vì vậy, quá trình và thread của tôi không có cùng một pid, như xảy ra trong một chủ đề chung. Thứ hai, ngay cả sau khi chuỗi của tôi đã được tạo, trường Threads: trong quy trình của tôi '/proc/self/status vẫn là 1. Vì vậy, chuỗi của tôi dường như không được nhận dạng làm chuỗi.

Câu hỏi của tôi là, những gì còn thiếu trong mã của tôi? Tôi phải làm gì để làm cho chuỗi của tôi hoạt động giống như một chuỗi chung? Có tùy chọn nào bị thiếu trong đối số thứ ba của clone không?

Trả lời

6

Bạn có thể muốn xem cờ CLONE_THREAD, nó sẽ đặt chuỗi mới trong cùng một nhóm chuỗi với quy trình gọi.

Khi bạn đưa CLONE_THREAD, nó sẽ làm cho chuỗi mới có cùng pid và ppid làm quá trình gọi. Nó được sử dụng trong các chủ đề posix. Dưới đây là một đầu ra từ hệ thống của tôi. cột LWP nói rằng là bây giờ là một quá trình có trọng lượng nhẹ và có TID khác nhau

UID  PID PPID LWP C NLWP SZ RSS PSR STIME TTY   TIME CMD 
anukalp 18398 9638 18398 0 2 464 456 0 10:56 pts/3 00:00:00 ./a.out 
anukalp 18398 9638 18399 0 2 464 456 1 10:56 pts/3 00:00:00 ./a.out 

Ngoài ra đầu ra thay đổi/proc/self/tình trạng, tôi đã thêm một vài printfs:

[anukalp @ localhost ~] $ ./a.out

This process pid: 18398 
Creating new thread... 
Done! Thread pid: 18399 /* This is now thread id, available to caller of clone */ 
getpid(): ad pid: 18399 
Inside func. 
getpid(): 18398 
getppid(): 9638 
Looking into /proc/self/status... 
Name: a.out 
State: R (running) 
Tgid: 18398 
Pid: 18398 
PPid: 9638 
TracerPid:  0 
Uid: 500  500  500  500 
Gid: 500  500  500  500 
FDSize: 256 
Groups: 7 19 22 80 81 82 83 100 490 500 
VmPeak:  1856 kB 
VmSize:  1856 kB 
VmLck:   0 kB 
VmPin:   0 kB 
VmHWM:  248 kB 
VmRSS:  248 kB 
VmData:  168 kB 
VmStk:  140 kB 
VmExe:   4 kB 
VmLib:  1516 kB 
VmPTE:  16 kB 
VmSwap:  0 kB 
Threads:  2 
SigQ: 1/14050 
SigPnd: 0000000000000000 
ShdPnd: 0000000000000000 
SigBlk: 0000000000000000 
SigIgn: 0000000000000000 
SigCgt: 0000000000000000 
CapInh: 0000000000000000 
CapPrm: 0000000000000000 
CapEff: 0000000000000000 
CapBnd: ffffffffffffffff 
Cpus_allowed: 00000000,000000ff 
Cpus_allowed_list:  0-7 
voluntary_ctxt_switches:  1 
nonvoluntary_ctxt_switches:  0 
Inside thread: thread pid = 18398 
Inside thread: thread ppid = 9638 

Vui lòng cho tôi biết nếu điều này có ích!

+0

Có, nó đã giúp tôi rất nhiều! Cảm ơn bạn! Và, bằng cách này, làm thế nào bạn có được đầu ra đầu tiên (một với cột LWP)? – LuisABOL

+0

Rất vui được biết nó đã giúp bạn! Lệnh cho đầu ra đầu tiên: ps -eLF – anukalp

Các vấn đề liên quan