这篇博客的形式我想以分析代码不同情况为主:

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<pthread.h>
  3. #include<time.h>
  4. #include<unistd.h>
  5. #include<errno.h>
  6. #include<stdlib.h>
  7. void *child(void *argv)
  8. {
  9. int pid;
  10. printf("这是线程在运行\n");                                    //一般我们创建线程,目的就是让它执行我们的一些命令或者任务,可以不用fork
  11. if((pid = fork()) < 0)
  12. perror("fork error");
  13. switch(pid)
  14. {
  15. case 0:
  16. if(execl("/bin/ls","ls",argv,"/home",NULL)== -1)
  17. {
  18. perror("execl error");
  19. }
  20. exit(0);
  21. default:
  22. printf("father\n");
  23. // sleep(3);
  24. /*sleep这条语句的执行有什么影响?*/
         答: 如果不执行sleep命令,那么父进程(原线程)在执行完之后会执行pthread_exit命令,然后会安全退出到main函数中,但是如果sleep函数执行,那么父进程(原线程)将会等待子进程的结束,当然,sleep(3)并不一定能保证子进程结束,但是在sleep期间,子进程会执行。

  1. }
  2. pthread_exit(0);
  3. }
  4. int main(int argc,char *argv[])            /*我们用argv可以给子线程中fork的进程传递参数进去。
  5. {
  6. pthread_t thid;
  7. pthread_attr_t attr;
  8. int detachstate;                       //新线程是否与其他线程脱离同步
  9. int schedpolicy;                       //新线程的调度策略
  10. int inheritsched;                      //新线程使用显式指定调度策略和调度参数
  11. int scope;                             //线程间争夺cpu的范围,可以与所有线程,也可以只与同进程中的争夺
  12. size_t guardsize;                      //警戒值
  13. size_t stacksize;                      //栈大小
  14. int *status;
  15. pthread_attr_init(&attr);
  16. /*在创建线程时,pthread_create函数的第二个参数为一个结构体,我们可以从结构体中获得线程的相关属性,但需要提前对这个结构体进行初始化,调用pthread_attr_init函数*/
  17. // pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_JOINABLE);
  18. /*我们可以通过设置线程的相关属性以达到我们想要的结果,上面这条语句就把线程的分离状态设置为可以与其他线程同步*/
  19. if(pthread_create(&thid,&attr,(void*)child,(void *)argv[1]) != 0)
  20. {
  21. printf ("new thread create failed\n") ;
  22. }
  23. /*创建一个线程,我们创建的线程再去执行child函数中的内容,child函数的参数为argv[1]*/
  24. pthread_join(thid, (void**)(&status));
  25. /*将父进程挂起,保证子线程可以执行完成*/
  26. // exit(0);
  27. /*若我们现在调用exit函数,下面的代码一定不会执行,但重点是我在线程中又fork了进程,那要是main函数先于子进程退出,子进程中的代码会不会执行?*/
            答:会执行,因为子进程的执行空间是完全与线程不同的两块空间,所以即使main函数退出,子进程中的代码还是会执行。


  1. printf("father process----------\n");
  2. pthread_attr_getdetachstate(&attr,&detachstate);
  3. pthread_attr_getschedpolicy(&attr,&schedpolicy);
  4. pthread_attr_getinheritsched(&attr,&inheritsched);
  5. pthread_attr_getscope(&attr,&scope);
  6. pthread_attr_getguardsize(&attr,&guardsize);
  7. pthread_attr_getstacksize(&attr,&stacksize);
  8. printf("分离状态:%d\n 调度策略:%d\n 继承性:%d\n 作用域:%d\n 警戒堆栈大小:%d\n 堆栈大小:%d\n",detachstate,schedpolicy,inheritsched,scope,guardsize,stacksize);
  9. // pthread_join(thid, (void**)(&status));
  10. /*两段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()的更多相关文章

  1. table中bordercolor属性设置后最新ie浏览器或firefox中不显示边线,借助table的css来实现边线

    table中的bordercolor属性设置后在最新的ie或者firefox中均不显示边线,table的边线又是常用功能.只能使用css来实现了,更通用,更方便一些. css: ​.ctable{ b ...

  2. 等待进程结束函数中的BUG

    偶然发现一个BUG,有一个函数是这样写的: void WaitProcExit(DWORD dwPid) { HANDLE hProcess = OpenProcess(PROCESS_ALL_ACC ...

  3. Linux线程-创建

    Linux的线程实现是在内核以外来实现的,内核本身并不提供线程创建.但是内核为提供线程[也就是轻量级进程]提供了两个系统调用__clone()和fork (),这两个系统调用都为准备一些参数,最终都用 ...

  4. windows进程/线程创建过程 --- windows操作系统学习

    有了之前的对进程和线程对象的学习的铺垫后,我们现在可以开始学习windows下的进程创建过程了,我将尝试着从源代码的层次来分析在windows下创建一个进程都要涉及到哪些步骤,都要涉及到哪些数据结构. ...

  5. 线程的属性和 线程特定数据 Thread-specific Data

    一.posix 线程属性 POSIX 线程库定义了线程属性对象 pthread_attr_t ,它封装了线程的创建者可以访问和修改的线程属性.主要包括如下属性: 1. 作用域(scope) 2. 栈尺 ...

  6. Posix线程编程指南(1) 线程创建与取消

    线程创建 1.1 线程与进程 相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列.在串行程序基础上引入线程和进程是为了提高程序的 ...

  7. 并发编程之线程创建到销毁、常用API

    在前面一篇介绍了线程的生命周期[并发编程之多线程概念],在本篇将正式介绍如何创建.中断线程,以及线程是如何销毁的.最后,我们会讲解一些常见的线程API. 线程创建 Java 5 以前,实现线程有两种方 ...

  8. 线程创建后为什么要调用CloseHandle

    很多程序在创建线程都这样写的: ............ ThreadHandle = CreateThread(NULL,0,.....); CloseHandel(ThreadHandle );  ...

  9. Delphi中怎么结束线程(这个线程是定时执行的)(方案二)

    上篇博客中提出了一个问题:怎么结束一个定时循环执行的线程,并给出了一个解决方案,但是又出现了一个问题,详细去参考上一篇博客. 然后出去撒了个尿,突然脑子里出现了一个想法(看来工作和思考久了,出去走走, ...

随机推荐

  1. iOS之内存管理-字节对齐

    字节对齐 1 struct Mystruct1{ 2 char a; //1字节 3 double b; //8字节 4 int c; //4字节 5 short d; //2字节 6 }Mystru ...

  2. ci框架驱动器

    1.驱动器什么是 驱动器是一种特殊类型的类库,它有一个父类和任意多个子类.子类可以访问父类, 但不能访问兄弟类.在你的控制器中,驱动器为你的类库提供了 一种优雅的语法,从而不用将它们拆成很多离散的类. ...

  3. css布局宽度自适应

    随着各种终端的不断涌现,网页中的元素适应不同的分辨率变得特别重要,根据经验,涉及到宽度自适应的一共有四种情况: 左端固定,右边自适应:右端固定,左边自适应:两端固定,中间自适应:中间固定,两端自适应. ...

  4. [源码解析] PyTorch 流水线并行实现 (3)--切分数据和运行时系统

    [源码解析] PyTorch 流水线并行实现 (3)--切分数据和运行时系统 目录 [源码解析] PyTorch 流水线并行实现 (3)--切分数据和运行时系统 0x00 摘要 0x01 分割小批次 ...

  5. Unittest 框架之断言,你学会了吗??

    unittest断言 Python在 unittest.TestCase 类中提供了很多断言方法.断言方法检查你认为应该满足的条件是否确实满足.如果该条件确实满足,你对程序行为的假设就得到了确认,你就 ...

  6. 使用 Vue 脚手架,为什么要学 webpack?

    先问大家一个很简单的问题: vue init webpack prjectName 与 vue create projectName 有什么区别呢? 它们是 Vue-cli 2 和 Vue-cli3 ...

  7. 11.5.2 LVS-NAT 实验

    NAT拓扑 lvs-server VIP:10.211.55.99DIP:10.37.129.99 负载均衡器 开启路由功能(VIP桥接,DIP仅主机) rs01 RIP:10.37.129.3 后端 ...

  8. 1-基本建表sql语句

    基本的建表语句的总结 --建表语法 CREATE TABLE 表名( --约束可以没有 列名1 数据类型 [约束], 列名2 数据类型 [约束], ......, [约束], ..... ); --该 ...

  9. 如何评估 Serverless 服务能力?这份报告给出了 40 条标准

    编者按:两年前,我们还在讨论什么是 Serverless,Serverless 如何落地.如今,已经有评测机构给出了 40 条标准来对 Serverless 的服务能力进行评估,这些评估细则既是技术生 ...

  10. java语言程序设计与数据结构(基础篇)第四章答案

    4.1 import java.util.Scanner; public class Welcome { public static void main(String[] args) { Scanne ...