编写日志文件

在这里插入图片描述

无名信号量

精灵程序

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <signal.h>
#include <sys/shm.h>
#include <sys/resource.h>
#include <sys/file.h>


#define SPACE 0
#define DATA 1
#define MEM_PATH "/mnt/share/project/project_01/"

union semun
{
    int val;
    struct semid_ds *buf;
    unsigned short *array;
    struct seminfo *__buf;
};


void shm_init(int id,int num,int val);
void P(int id,int num);
void V(int id,int num);
void my_log(char *str);
void sumu(void);

int main()
{
	pid_t a;
	
	int max_fd,i;
	
	
	/***************************************************
	1.忽略SIGHUP信号(关闭终端),防止进程被CTTY控制终端关闭
	*****************************************************/
	
	signal(SIGHUP,SIG_IGN);
	
	/***************************************************
	2.生成第一个子进程,确保能够正确产生新的会话期
	*****************************************************/	
	
	a = fork();
	if(a > 0)
	{
		exit(0);
	}
	
	/***************************************************
	3.调用setsid()函数,让第一个子进程产生新的没有控制终端的会话期
	*****************************************************/	
	
	setsid();
	
	/***************************************************
	4.生成第二个子进程,防止精灵进程打开终端文件创建控制终端
	*****************************************************/	
	
	a = fork();
	if(a > 0)
	{
		exit(0);
	}
	
	/***************************************************
	5.分离精灵进程的原生进程组,防止接收到任何控制进程组的信号
	*****************************************************/	
	
	setpgrp();
	
	/***************************************************
	6.关闭所有的文件描述符,释放资源
	*****************************************************/	
	
	max_fd = sysconf(_SC_OPEN_MAX);
	for(i = 0; i < max_fd; i++)
	{
		close(i);
	}
	
	/***************************************************
	7.文件权限掩码清零
	*****************************************************/
	
	umask(0);
	
	/***************************************************
	8.改变进程的工作路径,确保进程不会被卸载
	*****************************************************/
	
	chdir("/");
	
	/***************************************************
	9.精灵进程创建成功
	*****************************************************/
	//精灵进程要干的事
	my_log("精灵进程启动\n");
	sumu();

	pause();
	return 0;
}

void sumu(void)
{
    //signal(SIGINT,SIG_IGN);//捕捉ctrl+c信号
    key_t key =ftok(MEM_PATH,1);
    //create shm
    int shmid=shmget(key,1024,IPC_CREAT|0666);
    if(-1==shmid)
    {
        perror("shmget erro");
        exit(1);
    }
    //create 2 sem
    int semid=semget(key,2,IPC_CREAT|0666);
    if(-1==semid)
    {
        perror("semget erro");
        exit(1);
    }
    
    //init sem
    shm_init(semid,SPACE,1);//space设置信号量0为1
    shm_init(semid,DATA,0);//data设置信号量1为0

    char *p=shmat(shmid,NULL,0);
    if(NULL==p)
    {
        perror("shmat erro");
        exit(1);
    }

    printf("recv start\n");
    while(1)
    {
        P(semid,DATA);
        printf("recv:%s",p);
        my_log(p);
        V(semid,SPACE);
        if(!strncmp(p,"quit",4))
        {
            break;
        }
        
    }
    shmdt(p);
    return ;
}

void shm_init(int id,int num,int val)
{
    union semun a;
    a.val=val;
    semctl(id,num,SETVAL,a);
}

void P(int id,int num)
{
    struct sembuf sops[1];
    sops[0].sem_num=num;//信号量元素编号
    sops[0].sem_op=-1;//P操作
    sops[0].sem_flg=0;//0表示阻塞
    semop(id,sops,1);//执行P操作
}
void V(int id,int num)
{
    struct sembuf sops[1];
    sops[0].sem_num=num;//信号量元素编号
    sops[0].sem_op=1;//V操作
    sops[0].sem_flg=0;//0表示阻塞
    semop(id,sops,1);//执行V操作
}

void my_log(char *str)
{
    int fd = open("/mnt/share/project/project_01/log.txt",O_CREAT|O_RDWR|O_APPEND);
    if(-1 == fd)
    {
        perror("open erro");
        return;
    }
    write(fd,str,strlen(str));
    close(fd);
}

app函数(用户函数)

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <signal.h>
#include <sys/shm.h>
#include <time.h>

#define SPACE 0
#define DATA 1
#define MEM_PATH "/mnt/share/project/project_01/"

void shm_init(int id,int num,int val);
void P(int id,int num);
void V(int id,int num);

union semun
{
    int val;
    struct semid_ds *buf;
    unsigned short *array;
    struct seminfo *__buf;
};

struct sembuf sops;

int main(int argc,char const *argv[])
{
    signal(SIGINT,SIG_DFL);//捕捉ctrl+c信号,恢复默认信号处理函数
    key_t key =ftok(MEM_PATH,1);
    //create shm
    int shmid=shmget(key,1024,IPC_CREAT|0666);
    if(-1==shmid)
    {
        perror("shmget erro");
        exit(1);
    }
    //create 2 sem
    int semid=semget(key,2,IPC_CREAT|0666);
    if(-1==semid)
    {
        perror("semget erro");
        exit(1);
    }
    
    //init sem
    shm_init(semid,SPACE,1);//space设置信号量0为1
    shm_init(semid,DATA,0);//data设置信号量1为0

    char *p=shmat(shmid,NULL,0);//将shm映射到进程空间
    if(NULL==p)
    {
        perror("shmat erro");
        exit(1);
    }
    //获取日志的信息
    int pid = getpid();
    time_t now;
    time(&now);

    while (1)
    {
        memset(p,0,1024);
        P(semid,SPACE);//空间-1
        // printf("please input:");
        // fgets(p,1024,stdin);
        sprintf(p,"pid=%d,time=%s",pid,ctime(&now));
        V(semid,DATA);//数据+1
        
        if(!strncmp(p,"quit",4))
        {
            break;
        }
        //添加延迟
        usleep(1000000);
        
    }
    shmdt(p);
    return 0;
}

void shm_init(int id,int num,int val)
{
    union semun a;
    a.val=val;
    semctl(id,num,SETVAL,a);
}

void P(int id,int num)
{
    struct sembuf sops[1];
    sops[0].sem_num=num;//信号量元素编号
    sops[0].sem_op=-1;//P操作
    sops[0].sem_flg=0;//0表示阻塞
    semop(id,sops,1);//执行P操作
}
void V(int id,int num)
{
    struct sembuf sops[1];
    sops[0].sem_num=num;//信号量元素编号
    sops[0].sem_op=1;//V操作
    sops[0].sem_flg=0;//0表示阻塞
    semop(id,sops,1);//执行V操作
}

有名信号量

精灵进程

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <signal.h>
#include <sys/shm.h>
#include <sys/resource.h>
#include <sys/file.h>
#include <semaphore.h>

#define SPACE 0
#define DATA 1
#define MEM_PATH "/mnt/share/project/project_01/"

union semun
{
    int val;
    struct semid_ds *buf;
    unsigned short *array;
    struct seminfo *__buf;
};


void shm_init(int id,int num,int val);
void P(int id,int num);
void V(int id,int num);
void my_log(char *str);
void sumu(void);

int main()
{
	pid_t a;
	
	int max_fd,i;
	
	
	/***************************************************
	1.忽略SIGHUP信号(关闭终端),防止进程被CTTY控制终端关闭
	*****************************************************/
	
	signal(SIGHUP,SIG_IGN);
	
	/***************************************************
	2.生成第一个子进程,确保能够正确产生新的会话期
	*****************************************************/	
	
	a = fork();
	if(a > 0)
	{
		exit(0);
	}
	
	/***************************************************
	3.调用setsid()函数,让第一个子进程产生新的没有控制终端的会话期
	*****************************************************/	
	
	setsid();
	
	/***************************************************
	4.生成第二个子进程,防止精灵进程打开终端文件创建控制终端
	*****************************************************/	
	
	a = fork();
	if(a > 0)
	{
		exit(0);
	}
	
	/***************************************************
	5.分离精灵进程的原生进程组,防止接收到任何控制进程组的信号
	*****************************************************/	
	
	setpgrp();
	
	/***************************************************
	6.关闭所有的文件描述符,释放资源
	*****************************************************/	
	
	max_fd = sysconf(_SC_OPEN_MAX);
	for(i = 0; i < max_fd; i++)
	{
		close(i);
	}
	
	/***************************************************
	7.文件权限掩码清零
	*****************************************************/
	
	umask(0);
	
	/***************************************************
	8.改变进程的工作路径,确保进程不会被卸载
	*****************************************************/
	
	chdir("/");
	
	/***************************************************
	9.精灵进程创建成功
	*****************************************************/
	//精灵进程要干的事
	my_log("精灵进程启动\n");
	sumu();

	pause();
	return 0;
}

void sumu(void)
{
    key_t key =ftok(".",1);
    //create shm
    int shmid=shmget(key,1024,IPC_CREAT|0666);
    if(-1==shmid)
    {
        perror("shmget erro");
        exit(1);
    }    

     //create posix有名信号量
    sem_t *space = sem_open("/my_space",O_CREAT);//创建一个名为my_space的有名信号量
    sem_t *data = sem_open("/my_data",O_CREAT);//创建一个名为my_data的有名信号量

    char *p=shmat(shmid,NULL,0);
    if(NULL==p)
    {
        perror("shmat erro");
        exit(1);
    }
    while(1)
    {
        sem_wait(data);
        printf("recv:%s",p);
        my_log(p);
        sem_post(space);
        if(!strncmp(p,"quit",4))
        {
            break;
        }
        

    }
    
    shmdt(p);
    return 0;
}

void my_log(char *str)
{
    int fd = open("/mnt/share/project/project_01/log.txt",O_CREAT|O_RDWR|O_APPEND);
    if(-1 == fd)
    {
        perror("open erro");
        return;
    }
    write(fd,str,strlen(str));
    close(fd);
}

app进程

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <semaphore.h>
#include <signal.h>
#include <time.h>

sem_t *space,*data;

void func(int flag)
{
    sem_close(space);
    sem_close(data);
    sem_unlink("/my_space");
    sem_unlink("/my_data");
    exit(0);

}


int main(int argc,char const *argv[])
{
    signal(SIGINT,func);//
    key_t key =ftok(".",1);
    //create posix共享内存
    int shmid=shmget(key,1024,IPC_CREAT|0666);
    if(-1==shmid)
    {
        perror("shmget erro");
        exit(1);
    }
    //create posix有名信号量
    sem_t *space = sem_open("/my_space",O_CREAT,0666,1);//创建一个名为my_space的有名信号量
    sem_t *data = sem_open("/my_data",O_CREAT,0666,0);//创建一个名为my_data的有名信号量
    
    char *p=shmat(shmid,NULL,0);//将shm映射到进程空间
    if(NULL==p)
    {
        perror("shmat erro");
        exit(1);
    }
    int pid = getpid();
    time_t now;
    time(&now);

    while (1)
    {
       
        sem_wait(space);
        //如果空间不为空,且数据为0,说明没有数据所以发送数据
        // printf("please input:");
        // fgets(p,1024,stdin);
        sleep(1);
        sprintf(p,"pid=%d,time=%s",pid,ctime(&now));
        sem_post(data);
        if(!strncmp(p,"quit",4))
        {
            break;
        }
        
    }
    shmdt(p);
    return 0;
}


日志文件

在这里插入图片描述

结果图

在这里插入图片描述
在这里插入图片描述

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值