线程创建,属性设置与获得,等待线程结束,线程中fork,以及执行exec()
2015-08-04 21:07
399 查看
这篇博客的形式我想以分析代码不同情况为主:
点击(此处)折叠或打开
#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前面代码一定会在之前执行。
整体把握一下思路:首先在main()函数里pthread_create一个线程,然后在子线程中fork一个进程,让它去执行execl函数。
window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];
阅读(3) | 评论(0) | 转发(0) |
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...
给主人留下些什么吧!~~
评论热议
点击(此处)折叠或打开
#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前面代码一定会在之前执行。
整体把握一下思路:首先在main()函数里pthread_create一个线程,然后在子线程中fork一个进程,让它去执行execl函数。
window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];
阅读(3) | 评论(0) | 转发(0) |
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...
给主人留下些什么吧!~~
评论热议
相关文章推荐
- linux top 命令详解
- fork()和vfork()的区别,signal函数用法,exec()系列函数的用法小结
- Linux&C open creat read write lseek 函数用法总结
- 黑马程序员——Java 面型对象_封装
- 在VS2010上配置SGI_STL
- iOS UI04_Target-Action
- zoj 2100 Seeding 【dfs】
- 【Linux】如何用shell编写斐波那契函数
- POJ1465 Multiple BFS+同余判重
- 用objective-c开发的第一个mac程序(3)——动态库与静态库的问题
- Big Data Lambda Architecture 翻译
- LNMP的安装与配置
- 黑马程序员--iOS--Objective-C基础 (内存管理三)
- Obj-C内存管理(二)
- openwrt程序之udev
- securityoverridehacking challenge 解题思路汇总——JavaScript
- XCode上设备或证书不能自动建和修改的问题解决
- 2100 Seeding【dfs】
- MFC多线程各种线程用法
- Java 异常处理机制