Linux:守护进程
1.守护进程:长时间在后台运行的程序,一般情况下不会和用户进行交互。特点:(1)运行周期长(2)后台执行,一般不需要和用户进行交互。2.(1)会话:打开终端,即就是和系统建立会话,打开终端急救室和系统建立会话。(2)会话首进程:在会话中运行的第一个进程,即就是第一个打开的终端。(大多数情况下为bash)(3)进程组(4)组长进程3.会话流程(1)fork()产生一个子进程,退出父进程(2)sets
·
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);
}
更多推荐
已为社区贡献1条内容
所有评论(0)