线程创建,属性设置与获得,等待线程结束,线程中fork,以及执行exec()
来源:互联网 发布:警惕网络炒汇陷阱 编辑:程序博客网 时间:2024/06/07 06:43
这篇博客的形式我想以分析代码不同情况为主:
答:会有影响,因为pthread_join是将函数线程ID为thid的线程挂起,然后让子线程执行,那么这将意味着pthread_join前面代码一定会在之前执行。
整体把握一下思路:首先在main()函数里pthread_create一个线程,然后在子线程中fork一个进程,让它去执行execl函数。
点击(此处)折叠或打开
- #include<stdio.h>
- #include<pthread.h>
- #include<time.h>
- #include<unistd.h>
- #include<errno.h>
- #include<stdlib.h>
- void *child(void *argv)
- {
- int pid;
- printf("这是线程在运行\n"); //一般我们创建线程,目的就是让它执行我们的一些命令或者任务,可以不用fork
- if((pid = fork()) < 0)
- perror("fork error");
- switch(pid)
- {
- case 0:
- if(execl("/bin/ls","ls",argv,"/home",NULL)== -1)
- {
- perror("execl error");
- }
- exit(0);
- default:
- printf("father\n");
- // sleep(3);
- /*sleep这条语句的执行有什么影响?*/
答: 如果不执行sleep命令,那么父进程(原线程)在执行完之后会执行pthread_exit命令,然后会安全退出到main函数中,但是如果sleep函数执行,那么父进程(原线程)将会等待子进程的结束,当然,sleep(3)并不一定能保证子进程结束,但是在sleep期间,子进程会执行。
- }
- pthread_exit(0);
- }
- int main(int argc,char *argv[]) /*我们用argv可以给子线程中fork的进程传递参数进去。
- {
- pthread_t thid;
- pthread_attr_t attr;
- int detachstate; //新线程是否与其他线程脱离同步
- int schedpolicy; //新线程的调度策略
- int inheritsched; //新线程使用显式指定调度策略和调度参数
- int scope; //线程间争夺cpu的范围,可以与所有线程,也可以只与同进程中的争夺
- size_t guardsize; //警戒值
- size_t stacksize; //栈大小
- int *status;
- pthread_attr_init(&attr);
- /*在创建线程时,pthread_create函数的第二个参数为一个结构体,我们可以从结构体中获得线程的相关属性,但需要提前对这个结构体进行初始化,调用pthread_attr_init函数*/
- // pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_JOINABLE);
- /*我们可以通过设置线程的相关属性以达到我们想要的结果,上面这条语句就把线程的分离状态设置为可以与其他线程同步*/
- if(pthread_create(&thid,&attr,(void*)child,(void *)argv[1]) != 0)
- {
- printf ("new thread create failed\n") ;
- }
- /*创建一个线程,我们创建的线程再去执行child函数中的内容,child函数的参数为argv[1]*/
- pthread_join(thid, (void**)(&status));
- /*将父进程挂起,保证子线程可以执行完成*/
- // exit(0);
- /*若我们现在调用exit函数,下面的代码一定不会执行,但重点是我在线程中又fork了进程,那要是main函数先于子进程退出,子进程中的代码会不会执行?*/
答:会执行,因为子进程的执行空间是完全与线程不同的两块空间,所以即使main函数退出,子进程中的代码还是会执行。
- printf("father process----------\n");
- pthread_attr_getdetachstate(&attr,&detachstate);
- pthread_attr_getschedpolicy(&attr,&schedpolicy);
- pthread_attr_getinheritsched(&attr,&inheritsched);
- pthread_attr_getscope(&attr,&scope);
- pthread_attr_getguardsize(&attr,&guardsize);
- pthread_attr_getstacksize(&attr,&stacksize);
- printf("分离状态:%d\n 调度策略:%d\n 继承性:%d\n 作用域:%d\n 警戒堆栈大小:%d\n 堆栈大小:%d\n",detachstate,schedpolicy,inheritsched,scope,guardsize,stacksize);
- // pthread_join(thid, (void**)(&status));
- /*两段pthread_join函数位置不同,有什么影响吗?*/
答:会有影响,因为pthread_join是将函数线程ID为thid的线程挂起,然后让子线程执行,那么这将意味着pthread_join前面代码一定会在之前执行。
0
上一篇:多进程与多线程的联系与区别
下一篇:linux&c 进程控制 课后习题
相关热门文章
- linux 常见服务端口
- 【ROOTFS搭建】busybox的httpd...
- xmanager 2.0 for linux配置
- 什么是shell
- linux socket的bug??
- linux dhcp peizhi roc
- 关于Unix文件的软链接
- 求教这个命令什么意思,我是新...
- sed -e "/grep/d" 是什么意思...
- 谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
评论热议
0 0
- 线程创建,属性设置与获得,等待线程结束,线程中fork,以及执行exec()
- 线程的创建、等待、终止以及属性
- 控制台创建两个线程,等待一个线程的结束,执行另外一线程
- 线程结束等待与线程优先级
- 线程创建与等待
- 主线程等待子线程执行结束
- Java如何等待子线程执行结束
- Java如何等待子线程执行结束
- Java如何等待子线程执行结束
- Java如何等待子线程执行结束
- Java如何等待子线程执行结束
- Java如何等待子线程执行结束
- 等待指定线程结束
- 等待线程结束
- java中一个线程等待另一个线程执行完后再执行
- 创建线程和结束线程
- 线程等待执行完毕
- 管理线程之等待线程结束
- linux top 命令详解
- 时间Date的各种获取方式
- SQL server2008 身份认证模式修改密码
- LVM&RAID
- 解决virtul box 无法调大分辨率的方法
- 线程创建,属性设置与获得,等待线程结束,线程中fork,以及执行exec()
- Contest 4 1009 Walk Out【bfs】
- 利用坐标求任意多边形面积
- Linux下如何实现备份和还原
- 20150804-线程
- 变形课
- To Do List
- Map遍历的几种方法
- 删除所有的.svn 文件
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
立日有
4月24日
4月10日
4月18日
7日瘦腰汤
日行灯生产厂家
母婴日
4月17日
日代购
4月13日
3月27日
1月1日
日系鞋
日格本
10月4日
9月7日
1月27日
日上券
日丰地暖多少钱
10月6日
滑板日
日系豪华车品牌
日上免税店电话
1月16日
7月26日黄历
skii日上免税店价格
韩型日尚旗舰店
日字本
1月15日
日字簿
川主寺亚日酒店
日丰水管和伟星水管哪个好
日有
日在
日毴
日能
日时
日于
啊日
日对
日的