1.守护进程:长时间在后台运行的程序,一般情况下不会和用户进行交互。
特点:
(1)运行周期长
(2)后台执行,一般不需要和用户进行交互。
2.(1)会话:打开终端,即就是和系统建立会话,打开终端急救室和系统建立会话。
(2)会话首进程:在会话中运行的第一个进程,即就是第一个打开的终端。(大多数情况下为bash)
(3)进程组
(4)组长进程
3.会话流程
(1)fork()产生一个子进程,退出父进程
(2)setsid()建立一个新会话
(3)fork()退出父进程
(4)chdir将文件改到根目录下面
(5)umask(0)清空子网掩码
(6)close()清空所有描述符
(7)如果产生子进程,就要处理僵死进程

守护进程代码:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<time.h>
#include<sys/stat.h>

void set_demon()
{
	pid_t pid=fork();
	if(pid!=0)
	{
		exit(0);
	}

	setsid();//创建新会话

	pid==fork();
	if(pid!=0)
	{
		exit(0);
	}

	chdir("/");//把文件放入根目录
	umask(0);//掩码(改变权限)
	
	int size=getdtablesize();
	for(int i=0;i<size;i++)
	{
		close(i);
	}
}
int main()
{
	set_demon();
	while(1)
	{
		FILE*fp=fopen("/tmp/c215.log","a");
		if(fp==NULL)
		{
			break;
		}

		time_t tv;
		time(&tv);//
		fprintf(fp,"time is:%s",asctime(localtime(&tv)));
		fclose(fp);

		sleep(5);
	}
}                       

在这里插入图片描述
cat c215.log
在这里插入图片描述
4.生产者和消费者问题:有限缓冲区问题
优点:解耦,支持并发,支持忙闲不均

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<pthread.h>
#include<semaphore.h>

#define BUFF_MAX 10
#define SC_MAX 2
#define XF_MAX 3

int buff[BUFF_MAX];
int in = 0;
int out = 0;

sem_t sem_empty;
sem_t sem_full;
pthread_mutex_t mutex;

void* sc_thread(void* arg)
{
	int index = (int)arg;
	for (int i = 0; i < 30; i++)
	{
		sem_wait(&sem_empty);//是否有空闲位置
		pthread_mutex_lock(&mutex);
		buff[in] = rand() % 100;
		printf("第%d个线程,产生数据:%d,在%d位置\n", index, buff[in], in);
		in = (int + 1) % BUFF_MAX;
		pthread_mutex_unlock(&mutex);//解锁
		sem_post(&sem_full);//数据的个数

		int n = rand() % 10;
		sleep(n);
	}
}

void* xf_thread(void* arg)
{
	int index = (int)arg;
	for (int i = 0; i < 20; i++)
	{
		sem_wait(&sem_full);
		pthread_mutex_lock(&mutex);
		printf("-----第%d个线程,消费数据:%d,在%d位置\n", index, buff[out], out);
		out = (out + 1) % BUFF_MAX;
		pthread_mutex_unlock(&mutex);
		sem_post(&sem_empty);

		int n = rand() % 10;
		sleep(n);
	}
}

int main()
{
	sem_init(&sem_empty, 0, BUFF_MAX);
	sem_init(&sem_full, 0, 0);
	pthread_mutex_init(&mutex, NULL);

	srand((int)time(NULL));

	pthread_t sc_id[SC_NUM];
	pthread_t xf_id[XF_NUM];

	for (int i = 0; i < SC_NUM; i++)
	{
		pthread_create(&sc_id[i], NULL, sc_thread, (void*)i);//创建生产者
	}
	for (int i = 0; i < XF_NUM; i++)
	{
		pthread_create(&xf_id[i], NULL, xf_thread, NULL);//创建消费者
	}

	for (int i = 0; i < SC_NUM; i++)
	{
		pthread_join(sc_id[i], NULL);
	}
	for (int i = 0; i < XF_NUM; i++)
	{
		pthread_join(xf_id[i], NULL);
	}

	sem_destroy(&sem_empty);
	sem_destroy(&sem_full);
	pthread_mutex_destroy(&mutex);

	printf("main over\n");
	exit(0);
}

在这里插入图片描述

Logo

更多推荐