当前位置: 首页 > wzjs >正文

南宁seo网站建设费用seo研究中心晴天

南宁seo网站建设费用,seo研究中心晴天,wordpress头像缓存到本地,东莞寮步二手房目录 1.进程组和会话 2.守护进程 2.1守护进程daemon概念 2.2创建守护进程 3.线程 3.1线程的概念 3.2线程内核三级映射 3.3线程共享 3.4线程优缺点 4.线程控制原语 4.1获取线程id 4.2创建线程 4.3循环创建N个子线 4.4子线程传参地址,错误示例 4.5线程…

目录

1.进程组和会话

2.守护进程

2.1守护进程daemon概念 

2.2创建守护进程

3.线程

3.1线程的概念

3.2线程内核三级映射

3.3线程共享

3.4线程优缺点

4.线程控制原语

4.1获取线程id

4.2创建线程

4.3循环创建N个子线

4.4子线程传参地址,错误示例

4.5线程退出

4.6线程回收

4.6.1回收示例1

4.6.2回收示例2

4.7线程分离

4.8杀死(取消)线程

4.8.1终止线程方法


1.进程组和会话

- 进程聚集成为进程组,多个进程组聚集成为会话。

- ps ajx //查看 进程组id  和 会话id

- 创建会话 setsid()

 pid_t setsid(void); 

- 组长进程不能作为新会话的首进程,因此 fork() 后,终止父进程,子进程调用 setsid() 创建会话,以自己的进程pid, 为会话id 和 进程组 id。

2.守护进程

2.1守护进程daemon概念 

- Linux后台的一些服务进程,没有控制终端,不能直接和用户交互。不受用户登录、注销的影响,一直在后台运行。周期性的执行某种任务,或者等待某一事件的发生。 一般采用以d 结尾的命名方式。

2.2创建守护进程

int main(int argc, char *argv[])
{pid_t pid;int ret, fd;pid = fork();        // 创建子进程if (pid > 0)exit(0);        // 终止父进程pid = setsid();        // 子进程创建新会话.if (pid == -1)sys_err("setsid err");ret = chdir("/home/itcast/bj_40");  // 改变工作目录if (ret == -1)sys_err("chdir err");umask(0);            // 改变文件访问权限掩码,没有屏蔽任何权限close(STDIN_FILENO);// 关闭标准输入文件描述符fd = open("/dev/null", O_RDWR);   // fd ---> 0if (fd == -1)sys_err("open err");dup2(fd, STDOUT_FILENO);dup2(fd, STDERR_FILENO);while (1);            // 模拟守护进程业务return 0;
}

3.线程

3.1线程的概念

- Linux 系统中,线程 LWP 称之为:轻量级的进程。
- 进程:有独立的进程地址空间, 有独立的 pcb。 —— 最小资源分配单位。
- 线程:有独立的pcb,没有独立的进程地址空间。(与其他线程共享) —— 最小执行单位。

- 一个创建了线程的进程,本身也沦落 为线程。

- LWP 号: cpu 划分时间片依据。  —— 线程 最小执行单位。
- 查看LWP号命令: ps -Lf 进程pid 

3.2线程内核三级映射

- 三级映射。—— 解释了,为什么线程没有独立的进程地址空间。

3.3线程共享

- 独享:栈空间(用户栈、内核栈)errnum 
- 共享:./text  ./ordata  ./data  ./bss  heap堆 ----> 共享全局变量

3.4线程优缺点

- 优点:
    - 并发性强。  
    - 开销小。
    - 数据通信方便。
- 缺点:
    - 库函数,稳定性差。
    - 调试、编写困难
    - 对信号支持差。
- 结论:既能使用进程开发,也能使用线程开发的程序,首选 线程。

4.线程控制原语

4.1获取线程id

#include <pthread.h>

pthread_t pthread_self(void);   // 获取线程id, 在进程内部标识线程身份。

返回值:线程id

4.2创建线程

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                   void *(*start_routine) (void *), void *arg);

参1: 传出参数,新子线的 线程id
参2: 线程属性。默认传 NULL, 表使用默认属性。
参3: 子线程回调函数。pthread_create 调用成功,该函数会被自动调用起来。
参4: 参3 的参数。

返回值:
    成功:0
    失败:直接返回错误号!

- 线程中处理出错, 只能使用 strerror() , 不能使用 perror() ,举例如下:

#include <string.h>char *strerror(int errnum);
fprintf(stderr, "xxx error:%s\n", strerror(错误号));

- 创建子线程

// 子线程主函数
void *tfn(void *arg)
{printf("tfn : pid = %d, pthread_id = %lu\n", getpid(), pthread_self());return NULL;
}int main(int argc, char *argv[])
{pthread_t tid;// 创建子线程int ret = pthread_create(&tid, NULL, tfn, NULL);if (ret != 0)fprintf(stderr, "pthread_create err:%s\n", strerror(ret));printf("main : pid = %d, pthread_id = %lu\n", getpid(), pthread_self());sleep(1);        // 给子线程执行时间return 0;        // 释放进程地址空间
}

4.3循环创建N个子线

- 每个子线程打印,自己是第几个被创建出来。

void *tfn(void *arg)
{int i = (int)(long)arg;printf("I'm %dth thread: pid= %d, tid= %lu\n", i+1, getpid(), pthread_self());return NULL;
}int main(int argc, char *argv[])
{int i, ret;pthread_t tid;for (i = 0; i < 5; i++) {ret = pthread_create(&tid, NULL, tfn, (void *)(long)i);if (ret != 0)fprintf(stderr, "pthread_create err:%s\n", strerror(ret));}//sleep(i);usleep(10000);printf("I'm main thread: pid= %d, tid= %lu\n", getpid(), pthread_self());return 0;
}

4.4子线程传参地址,错误示例

4.5线程退出

void pthread_exit(void *retval);

参:代表线程的退出值。 无退出值,NULL

- 结论:
    - return:返回到调用者那里。
    - exit(): 退出当前进程。
    - pthread_exit(): 退出当前线程。

4.6线程回收

// 阻塞 回收线程。
int pthread_join(pthread_t thread, void **retval);


参1:待回收的线程id
参2:传出参数。回收的那个线程的 退出值。
    进程中:main返回值:return 0、 exit(1)  ---> int。 回收进程退出值 wait(int *)
    线程中:线程返回值:pthread_exit --> void *。 回收线程退出值 pthread_join(void **)


返回值:
    成功:0
    失败:直接返回错误号!

4.6.1回收示例1
// 子线程主题函数
void *tfn(void *arg)
{sleep(5);//return (void *)74;pthread_exit((void *)"hello");
}int main(int argc, char *argv[])
{pthread_t tid;//int *retval;    // 用来存储子进程退出值char *retval;    // 用来存储子进程退出值// 创建子线程int ret = pthread_create(&tid, NULL, tfn, NULL);if (ret != 0)fprintf(stderr, "pthread_create err:%s\n", strerror(ret));printf("----------------1\n");// 回收子线程退出值ret = pthread_join(tid, (void **)&retval);if (ret != 0)fprintf(stderr, "pthread_join err:%s\n", strerror(ret));printf("child thread exit with %s\n", (char *)retval);pthread_exit((void *)0);        // 退出主线程
}
4.6.2回收示例2
struct thrd {int var;char str[256];
};// 子线程主题函数
void *tfn(void *arg)
{struct thrd *tval = (struct thrd *)arg;            //malloc()tval->var = 100;strcpy(tval->str, "hello thread");pthread_exit((void *)tval);// return (void *)tval;                // 也可以
}int main(int argc, char *argv[])
{pthread_t tid;struct thrd arg, *retval;// 创建子线程int ret = pthread_create(&tid, NULL, tfn, (void *)&arg);if (ret != 0)fprintf(stderr, "pthread_create err:%s\n", strerror(ret));// 回收子线程退出值ret = pthread_join(tid, (void **)&retval);if (ret != 0)fprintf(stderr, "pthread_join err:%s\n", strerror(ret));printf("child exit with: var = %d, str= %s\n", retval->var, retval->str);// free();pthread_exit((void *)0);        // 退出主线程
}

4.7线程分离

- 与进程类似,线程结束时,也有 “僵尸线程” 产生。消耗系统资源。

int pthread_detach(pthread_t thread);  // 设置线程为分离态


参:待设置为分离的线程id

- 设置为分离态的线程,在终止时,会自动清理 pcb 内核残留。
- 对于已经分离的线程,使用 pthread_join() 不能正常回收。不能获取线程退出值。

4.8杀死(取消)线程

int pthread_cancel(pthread_t thread);


参:待杀死的线程id

1. 被 pthread_cancel() 杀死的线程,在使用 pthread_join() 回收,得到的退出值 -1。 
2. pthread_cancel() 杀死线程必须要到达一个 “取消点” (保存点), 才能生效。否则无法杀死线程。
    - 应该在被cancel的线程中,调用 pthread_testcancel() 函数来添加 “取消点” (保存点)

4.8.1终止线程方法

1. return
2. pthread_exit()
3. pthread_cancel()   需要 “保存点”。 —— 进内核,即可得到。

线程进程控制原语比对:

| 线程控制原语         | 进程控制原语|
| ------------------------- | ----------------- |
| pthread_create()     | fork()             |
| pthread_self()         | getpid()          |
| pthread_exit()         | exit()              |
| pthread_join()         | wait/waitpid() |
| pthread_cancel()    | kill()                |
| pthread_detach()    |                       |
 

http://www.dtcms.com/wzjs/405426.html

相关文章:

  • 做网站模板用什么框架手机端竞价恶意点击能防止吗
  • dw使用模板做网站教程优化落实疫情防控
  • 北京网站建设排名常州seo招聘
  • 网站建设新闻 常识百度推广客户端怎样注册
  • 选择一个域名进行网站建设常见的网站推广方法
  • 做谷歌推广比较好的公司成都seo优化公司排名
  • 烟台做网站公司哪家好东莞seo建站
  • 公司网站建设内部调查新闻近期大事件
  • asp.net做电商网站页面专业培训
  • 怎么做自己的淘宝客推广网站有趣的网络营销案例
  • 新疆建设职业培训中心网站福州百度seo代理
  • 网站卡密代理怎么做网络推广引流是做什么的
  • 专业网站设计制合肥作百度百科词条
  • 摄影设计说明500字seo网站排名推广
  • 汉口网站制作新人学会seo
  • 棋盘游戏类网站开发百度seo优化方案
  • 做网站旅游销售广州全网推广
  • 怎样做网站pptseo网站外包公司
  • 自己如何在网上做网站百度指数在哪里看
  • wordpress日文版seo优化标题
  • 男女做暖暖叉下体的试看网站seo网络优化是做什么的
  • 扬中论坛扬中热线贵港网站seo
  • 服务性企业网站宁波pc营销型网站制作
  • 网站突然消失了怎么给自己的公司做网站
  • 小工作室做网站seo商学院
  • 同一个ip的网站做链接有用如何建立自己的网页
  • 做招聘网站的客户想退钱灰色关键词排名代做
  • asp做网站步骤网络营销软文案例
  • 怎样在谷歌做网站深圳网站建设找哪家公司好
  • 营销型网站建设定制国际新闻头条今日国际大事