线程创建,属性设置与获得,等待线程结束,线程中fork,以及执行exec()
这篇博客的形式我想以分析代码不同情况为主:
点击(此处)折叠或打开
- #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这条语句的执行有什么影响?*/
- }
- 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函数先于子进程退出,子进程中的代码会不会执行?*/
- 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函数。
<script>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)];</script>
阅读(3) | 评论(0) | 转发(0) |
线程创建,属性设置与获得,等待线程结束,线程中fork,以及执行exec()的更多相关文章
- table中bordercolor属性设置后最新ie浏览器或firefox中不显示边线,借助table的css来实现边线
table中的bordercolor属性设置后在最新的ie或者firefox中均不显示边线,table的边线又是常用功能.只能使用css来实现了,更通用,更方便一些. css: .ctable{ b ...
- 等待进程结束函数中的BUG
偶然发现一个BUG,有一个函数是这样写的: void WaitProcExit(DWORD dwPid) { HANDLE hProcess = OpenProcess(PROCESS_ALL_ACC ...
- Linux线程-创建
Linux的线程实现是在内核以外来实现的,内核本身并不提供线程创建.但是内核为提供线程[也就是轻量级进程]提供了两个系统调用__clone()和fork (),这两个系统调用都为准备一些参数,最终都用 ...
- windows进程/线程创建过程 --- windows操作系统学习
有了之前的对进程和线程对象的学习的铺垫后,我们现在可以开始学习windows下的进程创建过程了,我将尝试着从源代码的层次来分析在windows下创建一个进程都要涉及到哪些步骤,都要涉及到哪些数据结构. ...
- 线程的属性和 线程特定数据 Thread-specific Data
一.posix 线程属性 POSIX 线程库定义了线程属性对象 pthread_attr_t ,它封装了线程的创建者可以访问和修改的线程属性.主要包括如下属性: 1. 作用域(scope) 2. 栈尺 ...
- Posix线程编程指南(1) 线程创建与取消
线程创建 1.1 线程与进程 相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列.在串行程序基础上引入线程和进程是为了提高程序的 ...
- 并发编程之线程创建到销毁、常用API
在前面一篇介绍了线程的生命周期[并发编程之多线程概念],在本篇将正式介绍如何创建.中断线程,以及线程是如何销毁的.最后,我们会讲解一些常见的线程API. 线程创建 Java 5 以前,实现线程有两种方 ...
- 线程创建后为什么要调用CloseHandle
很多程序在创建线程都这样写的: ............ ThreadHandle = CreateThread(NULL,0,.....); CloseHandel(ThreadHandle ); ...
- Delphi中怎么结束线程(这个线程是定时执行的)(方案二)
上篇博客中提出了一个问题:怎么结束一个定时循环执行的线程,并给出了一个解决方案,但是又出现了一个问题,详细去参考上一篇博客. 然后出去撒了个尿,突然脑子里出现了一个想法(看来工作和思考久了,出去走走, ...
随机推荐
- pycharm 增删改查 mysql数据库
1.pycharm创建mysql数据表######################################################import pymysql# 创建连接con = p ...
- pycharm向GitHub提交代码
设置为自动add commit代码 push代码 查看github,看到提交记录
- mysql允许别人通过ip访问本机mysql数据
要想允许别人通过ip访问本机mysql数据库,首先要是本机的mysql允许别的ip访问,也就是授权:其次别人的代码里,要写对本机的ip. 一.本机mysql的授权操作 1.cmd 进入控制台 2.输入 ...
- css 圆形脉冲动画
需求: 项目需要在3D场景增加动画按钮,直接添加到场景时 当场景过大的时候 .加载比较麻烦 因在找资料时发现这玩意居然要付费.故做此记录, 效果: 参考: 1.https://www.jiangwei ...
- selenium+python处理Alert弹窗
from selenium import webdriver import win32api import win32con from time import sleep driver = webdr ...
- LR集合点策略
给大家分享一个LR集合点策略,跑并发脚本时,一定要设置策略,要不然得出的响应时间无意义.默认选择第一个(当所有虚拟用户中的x % 到达集合点进释放,即仅当指定百分比的虚拟用户到达集合点时,才释放虚拟用 ...
- 『Python』matplotlib实现GUI效果
1. 类RadioButtons的使用方法 类似单选框 import numpy as np import matplotlib.pyplot as plt import matplotlib as ...
- 3.docker容器常用命令
docker容器的常用命令 docker有很多命令,让我们一个一个全部背下来,基本是不可能的,帮助文档的作用就很大了,想要查询那个命令,直接去找帮助文档,帮助文档地址:https://docs.doc ...
- docker-compose 搭建mongo集群
创建目录 在每台机器上操作此步骤 一.在编写容器文件之前的注意事项: 1.yaml文件的指令前端不能使用tab键只能使用空格 2.storage: 指令的对接只能使用 : 不能使用 = 冒号的后面要跟 ...
- Fiddler抓包一键生成代码
首先我们的需求场景是 用Fiddler抓到某个接口调用后,用代码来模拟调用,一般我们写代码会有3个步骤: 1设置http请求相关的参数:header,method,url,cookie等 2设置pos ...