信号通讯
1.常见的信号类型:
SIGHUP 从终端发出的结束信号
SIGINT 来自键盘的终断信号(ctrl-c)
SIGKILL 该信号结束接收信号的进程
SIGTERM kill命令发出的信号
SIGSTOP 来自键盘(ctrl-z)或调试程序的停止执行信号
2.发送信号的主要函数有kill和raise
区别:
kill既可向自身发送信号,也可以像其他进程发送信号
raise只向进程自身发送信号
#include <sys/types.h>
#include <sysnal.h>
int kill(pid_t pid,int signo);
int raise(int signo);
kill的pid参数:
①,pid > 0 将信号发送之后进程ID为PID的进程
②,pid == 0 将信号发送给其他进程组的进程
③,pid < 0 将信号发送给其他进程组ID等于PID绝对值的进程
④,pid == -1 将信号发送给所有的进程
3.“闹钟函数”
#include <unistd.h>
unsignd int alarm(unsigned int seconds);
经过seconds秒后,会产生SIGALRM信号,如果不捕捉此信号,则默认动作是终止该进程
4.”挂起“----pause
pause函数使调用进程挂起直至捕捉到一个信号
#include <unistd.h>
int pause(void);
只有执行一个信号处理函数后,挂起来才结束。
5.signal
#include <signal.h>
void (* signal (int signo,void (*func) (int))) (int) )
|| )
\/ ) ====> 这个是真的不好理解啊!
typedef void (* sighandler_t)(int) )
sighandler_t signal (int signum,sighandler_t handler) )
func可能的值是:
1. SIG_IGN 忽略此信号
2. SIG_DFL 按系统默认方式处理
3.信号处理函数 使用该函数处理
例:
#include <stdlib.h>
#include <signal.h>
void my_func(int sign_no)
{
if (sign_no == SIGINT)
printf("I have get SIGINT\n");
else if (sign_no == SIGQUIT)
printf("I have get SIGQUIT\n");
}
int main(void)
{
printf("waiting for signal SIGINT or SIGQUIT\n");
// 注册信号处理函数
signal(SIGINT,my_func);
signal(SIGQUIT,my_func);
pause();
exit(0);
}
运行程序后·······使用ps aux看看这个程序的pid
在使用kill命令试着给它发送SIGINT或者SIGQUIT信号,看看结果
共享内存
1,定义:被多个进程共同使用的一段物理内存。
2,创建共享内存
int shmget(ket_t key,int size,int shmflg); //size是创建共享内存的大小
key标示共享内存的键值:O/IPC_PRVIATE,当key的取值为IPC_PRIVATE,则函数shmget()将创建一块新的共享内存,如果key的取值为0,而参数shmflg中又设 置IPC_PIRVATE这个标志,则会同样创建一块新的共享内存。
返回值:成功,则返回共享内存标示符,失败则返回-1.
3,映射
int shmat(int shmid,char *shmaddr,int flag);
shmid: shmget 函数返回的共享存储标示符
shmaddr:假如为0 的话,系统自动指定地址
flag:决定以什么方式来确定映射的地址(通常为0)
返回值:
如果成功,则返回共享内存映射到进程中的地址,失败则返回-1
当一个进程不在需要共享内存时,需要把它从进程地址空间中脱离
intshmadt(char * shmaddr);
例:
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define PERM S_IRUSR|S_IWUSR
// 共享内存
int main(int argc,char ** argv)
{
int shmid;
char *p_addr,*c_addr;
if (argc != 2)
{
fprintf(stderr,"Usage: %s\n\a",argv[0]);
exit(1);
}
// 创建共享内存
if ((shmid = shmget(IPC_PRIVATE,1024,PERM)) == -1)
{
fprintf(stderr,"Creat Share Memory Error: %s\n\a",strerror(errno));
exit(1);
}
// 创建子进程
if (fork()) // 父进程写
{
p_addr = shmat(shmid,0,0);
memset(p_addr,'\0',1024);
strncpy(p_addr,argv[1],1024);
wait(NULL);
exit(0);
}
else // 子进程读
{
sleep(1);
c_addr = shmat(shmid,0,0);
printf("Client get %s \n",c_addr);
exit(0);
}
}
欢迎大神指针批评····