免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 16929 | 回复: 12

在程序中创建一个线程,PS查看发现有三个相同名称的进程 [复制链接]

论坛徽章:
0
发表于 2008-07-22 11:01 |显示全部楼层
程序名叫foo
int main(void)
{
      ...
      pthread_create(&tud, NULL, my_thread, NULL);
      
      while (1) {
               do something;
       }
}

void * my_thread(void *arg)
{
      while (1) {
             do somting;
      }
      
       return 0;
}

通过ps aux | grep foo查看发现有三个进程,应该只有两个才对阿,多出来的那个是怎么产生的呢?

论坛徽章:
0
发表于 2008-07-22 11:08 |显示全部楼层
还有一个就是grep foo这个进程

论坛徽章:
0
发表于 2008-07-22 11:25 |显示全部楼层
Linux线程在底层跟进程什一个概念.

论坛徽章:
0
发表于 2008-07-22 11:59 |显示全部楼层
原帖由 scutan 于 2008-7-22 11:08 发表
还有一个就是grep foo这个进程


当然不包括grep foo了,ps aux | grep foo的结果是:
3116  root        648 S     /usr/local/bin/foo
3117  root        648 S     /usr/local/bin/foo
3118  root        648 S     /usr/local/bin/foo
3121  root        476 S     grep foo

论坛徽章:
0
发表于 2008-07-22 13:16 |显示全部楼层
还有一个是用于 管理线程的线程,是linux不同GNU特有的,也跟线程库的版本有关.详细情况可以找一些linux,线程发展史看一下.

[ 本帖最后由 wangsongnian828 于 2008-7-22 13:20 编辑 ]

论坛徽章:
0
发表于 2008-07-22 14:09 |显示全部楼层
WINDOWS和Linux/UNIX的一个重要区别就是WINDOWS的执行单元和LINUX不同.在WINDOWS中.进程只是一个壳.线程是基本执行单元.而LINUX则进程就是基本执行单元没有线程一说.LINUX中的线程基本源自fork函数.实际是一个新的进程只是可以与原程序共享数据.pthread也是对fork进程的包装(算是我的猜测吧.因为我在苹果机上用pthread然后在苹果下的任务管理器中看,它会显示一个进程包含了多个线程.呵呵.)

论坛徽章:
0
发表于 2008-07-25 10:24 |显示全部楼层
LZ是在linux下创建的吗?
对于在一个进程中创建的多线程,貌似用ps是看不到线程的,虽然linux的多线程是用进程实现的,如果
你调用fork创建子进程的话,ps可以看到多个。
不过你可以在proc下看看到底有几个线程,方法:
ps获取当前你的程序的PID
然后
  1. cat /proc/你进程的ID/status | grep Threads
复制代码
就能看到该程序创建线程的个数了。
下面是一个例子,ps看到的只有一个进程。(我的系统是linux AS4 64位 kernel 2.6.9-11.ELsmp)
//duanjigang@2008-07-25

//thread_test.c

//build: gcc thread_test.c -o thread_test -lpthread

#include <pthread.h>
#include <stdio.h>
void * thread_func(void*);

int main(int argc, char* argv[])
{
&nbsp;&nbsp;&nbsp;&nbsp;pthread_t thread;
&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;interval = 1;
&nbsp;&nbsp;&nbsp;&nbsp;if(pthread_create(&thread, NULL, thread_func, 0) != 0)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("create tread fail\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;if(pthread_detach(thread) != 0)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("thread detach fail\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;while(1)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("I am the main thread\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(1);
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;return 1; &nbsp;&nbsp;&nbsp;&nbsp;
}
void* thread_func(void* pData)
{
&nbsp;&nbsp;&nbsp;&nbsp;int interval = 0;
&nbsp;&nbsp;&nbsp;&nbsp;if(!pData)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;interval = 1;
&nbsp;&nbsp;&nbsp;&nbsp;}else
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;interval = *(int*)pData;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;if(interval <= 0)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;interval = 1;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;while(1)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("I am a thread function\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(interval);
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}


[ 本帖最后由 duanjigang 于 2008-7-25 10:30 编辑 ]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
发表于 2008-07-25 19:50 |显示全部楼层
原帖由 duanjigang 于 2008-7-25 10:24 发表
LZ是在linux下创建的吗?
对于在一个进程中创建的多线程,貌似用ps是看不到线程的,

用 ps 当然可以看到线程,在 ps 的手册中搜索一下 thread.

论坛徽章:
0
发表于 2008-07-26 09:21 |显示全部楼层
原帖由 MMMIX 于 2008-7-25 19:50 发表

用 ps 当然可以看到线程,在 ps 的手册中搜索一下 thread.

哦,还不清楚这个,我一直都是看proc文件
不过LZ用ps aux 看到的不是线程吧

论坛徽章:
0
发表于 2008-07-27 10:48 |显示全部楼层
线程和进程实际上没什么区别
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP