linux clone线程,如何在Linux上使用clone()创建真正的线程?

博客讨论了在Linux环境下使用clone函数创建线程时遇到的问题,即新线程的pid与父进程不同且未被识别为普通线程。解决方案是添加CLONE_THREAD标志,这将使新线程与父进程具有相同的pid和ppid,并在/proc/self/status中显示为线程。
摘要由CSDN通过智能技术生成

我正在尝试使用clone()创建一个新线程.使用以下代码(…):

#include

#include

#include

#define _SCHED_H 1

#define __USE_GNU 1

#include

#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;

}

我得到以下内容:

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

那么,简而言之,我的计划做了什么?它使用clone创建一个新线程并打印其/ proc / self / status,以便我可以看到它的状态.由于我的线程休眠1秒,因此在打印/ proc / self / status时它仍处于活动状态.

但是,至少有两件事使我的线程不像普通线程.首先,正如您在上面看到的,进程’pid是10839而我的线程的pid是10840.因此,进程和我的线程没有相同的pid,就像在一个共同的线程中一样.其次,即使在我的线程创建之后,我的进程’/ proc / self / status文件的Threads:字段仍然是1.所以,我的线程似乎不被识别为线程.

我的问题是,我的代码中缺少什么?我需要做些什么才能使我的线程像普通线程一样?克隆的第三个参数中是否缺少任何选项?

解决方法:

您可能希望看到标志CLONE_THREAD,它会将新线程放在与调用进程相同的线程组中.

一旦你给了CLONE_THREAD,它将使新线程与调用进程具有相同的pid和ppid.它用于posix线程.以下是我系统的输出. LWP专栏说这是一个轻量级的过程,具有不同的TID

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

此外,/ proc / self / status的输出发生了变化,我添加了几个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

请让我知道这可不可以帮你!

标签:linux,multithreading,process

来源: https://codeday.me/bug/20190517/1122666.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值