我正在尝试使用

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

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

linux下clone一直运行,如何在Linux上使用clone()创建真正的线程?相关推荐

  1. Linux下监控磁盘io,如何在Linux下监控磁盘IO?

    [51CTO.com快译]iostat用于获取存储设备和分区的I/O统计信息.iostat是sysstat软件包的一部分.使用iostat,你可以监控存储设备(比如硬驱和SSD)以及分区(磁盘分区)的 ...

  2. linux下开放sftp端口,如何在 Linux 系统中如何更改 SFTP 端口

    如何在 Linux 系统中如何更改 SFTP 端口 SFTP(SSH文件传输协议)是一种安全文件协议,用于通过加密连接在两个主机之间传输文件. 它还允许您对远程文件执行各种文件操作并恢复文件传输. S ...

  3. Linux下wine能运行游戏吗,Linux下用Wine玩游戏卡吗

    ai0909 于 2011-10-14 17:09:06发表: 0:w(5( live_forever 于 2011-07-19 17:25:15发表: linux不是用来玩游戏的. hunkgao ...

  4. linux 嵌入上电自动运行,如何在linux嵌入式开发板上开机自动运行用户应用程序...

    开机后自动运行用户的应用程序或启动系统服务的命令保存在开发板根文件系统的/usr/etc/rc.local文件中.有的开发板开机后自动运行图形界面程序,需要按住ctrl+c让开发板进入到linux的S ...

  5. linux下脚本文件运行不了,linux执行sh脚本游戏蜂窝运行没反应

    将"ScriptableAdminDemo"软件包的关键字作为其中一个参数 OnErrorResumeNext SetWSHShell=WScript.CreateObject(& ...

  6. 如何在linux系统下修改mysql密码_如何在linux下修改mysql数据库密码?linux修改数据库密码的方法...

    本篇文章给大家带来的内容是介绍如何在linux下修改mysql数据库密码?linux修改数据库密码的方法.有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助. Linux下修改Mysql的 ...

  7. Linux下安装Dubbo运行环境

    Linux下安装Dubbo运行环境 1.1.1    安装jdk zk首先需要安装jdk环境. yum -y install glibc.i686       #jdk依赖glibc mkdir /u ...

  8. linux查看并口设备,如何在LINUX下实现硬件的自动检测(下)

    本文是<如何在LINUX下实现硬件的自动检测>一文的下部分,作者将继续向我们讲述如何自动检测另外几种总线类型硬件设备. 5 .USB设备的自动检测 5.1 USB设备检测的一般过程 USB ...

  9. 从一道面试题谈linux下fork的运行机制

    http://kb.cnblogs.com/page/76622/ 今天一位朋友去一个不错的外企面试linux开发职位,面试官出了一个如下的题目: 给出如下C程序,在linux下使用gcc编译: #i ...

最新文章

  1. 【思科】BGP的community属性解析
  2. SQL SERVER提供了大量的WINDOWS和SQLSERVER专用的排序规则
  3. 为什么说DevOps的必然趋势是BizDevOps?
  4. 二、Zabbix 服务端部署安装
  5. 如何生成全局唯一标识
  6. 【杂项】2021年年度报告
  7. Android动态切换主题
  8. mysql从只有一个备份文件(多个数据库的备份)中恢复数据到指定数据库
  9. 【学习】自定义view
  10. linux编写的员工管理系统,员工信息管理系统设计与实现(叶晖).doc
  11. 4种Dolby声场技术的区别
  12. navicat报错SSH:Unable to load key
  13. 微信小程序退出到微信
  14. Bootstrap栅格系统原理
  15. 2021-03-02 Windows远程桌面简易教程
  16. 诺基亚N81手机宝典!由浅入深玩转手机
  17. 一分钟解决你的公有云私有云选择困难症
  18. 研究生毕业后,再重新读个硕士
  19. mac上metersphere本地开发环境搭建
  20. Linux查看ice版本,转Linux下安装Ice过程

热门文章

  1. Python设计模式-解释器模式
  2. Redis数据库搭建集群(集群概念、redis集群、搭建集群(配置机器1、2、创建集群、数据操作验证)、Python与redis集群交互)
  3. GNN|如何做的比卷积神经网络更好?
  4. 目标检测任务中的训练宝典 |实用技巧
  5. centos7 升级openssh7.4之后 报错
  6. 背水一战 Windows 10 (65) - 控件(WebView): 对 WebView 中的内容截图, 通过 Share Contract 分享 WebView 中的被选中的内容...
  7. 诺基亚:IMPACT智能管理平台已安全管理超过15亿部物联网设备
  8. 分布式数据库灵活存储机制与应用实践
  9. [系统开发] Postfix 邮件管理系统
  10. 黑客带来了病毒攻击软件还是文化?