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

我正在尝试使用

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.所以,我的线程似乎不被识别为线程.

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值