守护进程创建、linux线程-创新互联

 守护进程定义:

周期性的执行某项任务或等待某个事件发生的进程,他的运行不依赖shell终端,他的生存周期较长,从开机开始运行直到关机结束。

成都网站设计、做网站介绍好的网站是理念、设计和技术的结合。创新互联拥有的网站设计理念、多方位的设计风格、经验丰富的设计团队。提供PC端+手机端网站建设,用营销思维进行网站设计、采用先进技术开源代码、注重用户体验与SEO基础,将技术与创意整合到网站之中,以契合客户的方式做到创意性的视觉化效果。守护进程的创建步骤:

  1.创建一个子进程,让父进程退出

  fork

  2.创建新的会话期(在子进程) 

  setsid();

  3.改变子进程的工作目录

  chdir("/")

  4.取消文件权限掩码

  umask(0)

  5.关闭所有文件描述符

  getdtablesize

  opendir readdir chdir

线程相关

  定义:线程是一种轻量级的进程用task_struct来标识它,它没有自己的独立内存空间,它共 享创建它的进程的地址空间。

  线程创建:

  使用第三方线程库提供的API

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
     作用:创建一个线程
      *thread:指向线程ID的指针 
     *attr:线程属性,通常给NULL
     参数三:指向线程执行函数的函数指针
     *arg:传给线程执行函数的入参
     返回值:0 成功;非0 失败
 int pthread_join(pthread_t thread, void **retval);
     作用:阻塞等待线程结束,并回收状态值
      thread:线程ID
      **retval:指向线程退出状态值的指针
 void pthread_exit(void *retval);
     作用:线程退出函数
     *retval:线程退出状态值
  int pthread_cancel(pthread_t thread);
     作用:取消线程
      thread:线程ID
unubtu=Linux内核+各种工具+桌面管理器+各种库+各种应用程序
多线程的通信 同步 互斥
在一个进程中可以创建多个线程,那么多个线程间会存在数据通信问题,
 会存在两个线程相互配合完成一件事情,会存在两个线程对公共资源的竞态访问问题
 多线程的数据通信-->使用全局变量
     ./pthead_com1  hello
 多线程的同步-->无名信号量  sem_t sem;
     同步:两个线程按照一定的顺序相互配合完成一件事情
pthread1-->hello   1S   sem_t  sema;-->P/V操作函数控制sema和semb
pthread2-->world  1s   sem_t semb;
     P操作:sem_wait(&sema)
         含义:sem_wait会检测信号量sema的值是否大于0,若大于0,将sema减一
                 同时函数返回。若等于0,阻塞当前线程。
     V操作:sem_post(&sema)--》非阻塞函数
         含义:sem_post只会给检测的信号量sema加1        

多线程的互斥

互斥的引入:多个线程可能会使用同一段公共资源,若是同时访问这段公共资源,就会造成多个线程对公共资源的竞争,从而造成访问结果混乱。

如何解决:可以使用互斥锁。

(1)多个线程能否使用同一个线程执行函数

#include#includevoid *ThreadFunc(void *arg)
{
    printf("into thread func---------\r\n");
}
int main()
{
    pthread_t tID1 = -1;
    pthread_t tID2 = -1;
    if(0 != pthread_create(&tID1,NULL,ThreadFunc,NULL))
    {
        return -1;
    }
    if(0 != pthread_create(&tID2,NULL,ThreadFunc,NULL))
    {
        return -1;
    }
    pthread_join(tID1,NULL);
    pthread_join(tID2,NULL);
}

(2)两个线程给线程执行函数传入不同的参数,最后执行结果是否发生混乱?

#include#include#include#define BUF_SIZE 11

void *ThreadFunc(void *arg)
{
    int i = 0;
    printf("into thread func---------\r\n");
    if(NULL == arg)
    {
        return (void *)NULLL;
    }
    char *pArr = (char *)arg;
    static char buf[BUF_SIZE] = {0};
    for(;i< 10; i++)
    {
        buf[i] = pArr[i];
        usleep(5000);
    }
    printf("buf:%s\r\n",buf);
}
int main()
{
    pthread_t tID1 = -1;
    pthread_t tID2 = -1;
    char arr1[] = "123456789";
    char arr2[] = "abcdefghi";
    if(0 != pthread_create(&tID1,NULL,ThreadFunc,(void *)arr1))
    {
        return -1;
    }
    if(0 != pthread_create(&tID2,NULL,ThreadFunc,(void *)arr2))
    {
        return -1;
    }
    pthread_join(tID1,NULL);
    pthread_join(tID2,NULL);
}

(3)使用互斥锁解决两线程互斥访问公共资源

pthread_mutex_t mutex;//线程互斥锁

pthread_mutex_init(&mutex,NULL)

pthread_mutex_lock(mutex);

pthread_mutex_unlock(mutex);

#include#include#include#define BUF_SIZE 11
pthread_mutex_t mutex;

void *ThreadFunc(void *arg)
{
    int i = 0;
    printf("into thread func---------\r\n");
    if(NULL == arg)
    {
        return (void *)NULLL;
    }
    pthread_mutex_lock(&mutex);
    char *pArr = (char *)arg;
    static char buf[BUF_SIZE] = {0};
    for(;i< 10; i++)
    {
        buf[i] = pArr[i];
        usleep(5000);
    }
    printf("buf:%s\r\n",buf);
    pthread_mutex_unlock(&mutex);
}
int main()
{
    pthread_t tID1 = -1;
    pthread_t tID2 = -1;
    char arr1[] = "123456789";
    char arr2[] = "abcdefghi";
    if(-1 == pthread_mutex_init(&mutex,NULL))
    {
        return -1;
    }
    if(0 != pthread_create(&tID1,NULL,ThreadFunc,(void *)arr1))
    {
        return -1;
    }
    if(0 != pthread_create(&tID2,NULL,ThreadFunc,(void *)arr2))
    {
        return -1;
    }
    pthread_join(tID1,NULL);
    pthread_join(tID2,NULL);
}

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


标题名称:守护进程创建、linux线程-创新互联
当前路径:http://pwwzsj.com/article/gcddp.html