嵌入式第三十二天(信号,共享内存)
一.信号
2.主要信号:
3.信号处理流程
二.相关函数接口
1.
2.发送信号
示例:
#include<stdio.h>
#include<unistd.h>
#include<signal.h>
#include<stdlib.h>
#include<sys/wait.h>
#include <sys/types.h>void handler(int signum)
{int i = 3;while(i--){printf("son is doing homework\n");}kill(getppid(),SIGUSR2);exit(0);
}void handler1(int signum)
{int i = 2;while(i--){printf("father is going home\n");sleep(1);}wait(NULL);exit(0);
}int main(int argc,const char *argv[])
{pid_t pid = fork();if(pid > 0){signal(SIGUSR2,handler1);int i = 8;while(i--){printf("father is working\n");sleep(1);}kill(pid,SIGUSR1);while(1){printf("father is go shopping\n");sleep(1);}}else if(pid == 0){signal(SIGUSR1,handler);while(1){printf("son is playing games\n");sleep(1);}}else{printf("fork error\n");return -1;}return 0;
}
3.其他发送信号的函数接口
示例:
#include<stdio.h>
#include<signal.h>
#include<stdlib.h>
#include<unistd.h>int cnt = 1;void handler(int signum)
{printf("超时%d次\n",cnt);if(cnt == 3){exit(0);}alarm(3);cnt++;
}int main(int argc,const char *argv[])
{char buff[1024] = {0};signal(SIGALRM,handler);alarm(3);while(1){fgets(buff,sizeof(buff),stdin);cnt = 1;alarm(3);}return 0;
}
三.共享内存
1.原理
2.流程:
3.相关函数接口
1.
2.
3.
4.
5.
示例:
#ifndef __HEAD_H__
#define __HEAD_H__#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/ipc.h>
#include <sys/shm.h>#endif
send:
#include "head.h"int main(int argc, const char *argv[])
{//ftok();//shmget();//shmat();//p-->//shmdt();//shmctl();key_t key = ftok(".", '!');if (key < 0){perror("ftok error");return -1;}printf("key = %x\n", key);int shmid = shmget(key, 4096,IPC_CREAT|0664);if (shmid < 0){perror("shmget error");return -1;}printf("shmid = %d\n", shmid);void *pmem = shmat(shmid, NULL, !SHM_RDONLY);if ((void *)-1 == pmem){perror("shmat error");return -1;}//*((int *)pmem) = 10;strcpy((char *)pmem, "hello");shmdt(pmem);//shmctl(shmid, IPC_RMID, NULL);return 0;
}
receive:
#include "head.h"int main(int argc, const char *argv[])
{//ftok();//shmget();//shmat();//p-->//shmdt();//shmctl();key_t key = ftok(".", '!');if (key < 0){perror("ftok error");return -1;}printf("key = %x\n", key);int shmid = shmget(key, 4096, IPC_CREAT|0664);if (shmid < 0){perror("shmget error");return -1;}printf("shmid = %d\n", shmid);void *pmem = shmat(shmid, NULL, !SHM_RDONLY);if ((void *)-1 == pmem){perror("shmat error");return -1;}printf("recv: %s\n", (char *)pmem); shmdt(pmem);//shmctl(shmid, IPC_RMID, NULL);return 0;
}
6.共享内存其他相关操作
7.实现进程间同步方法