线程创建,属性设置与获得,等待线程结束,线程中fork,以及执行exec()

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

点击(此处)折叠或打开

  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函数。


阅读(3) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议

版权声明:本文为博主原创文章,未经博主允许不得转载。

posted on 2015-08-04 21:07  杨博东的博客  阅读(413)  评论(0编辑  收藏  举报

导航