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