讲得比较清楚的进程相互通信的一个url:https://blog.csdn.net/zqixiao_09/article/details/50485047
linux下C++的关于进程同步的做法
线程与进程的区别:
一个程序至少一个进程,一个进程至少一个线程。
同一进程内的线程共享本进程的资源如内存、I/O、cpu等,但是进程之间的资源是独立的。
对效率较高,频繁切换,对资源保护要求比较低则使用线程。
对效率要求没这么高,对资源保护毕竟高的时候使用进程,进程甚至可以在不同的机子上进行。
signal函数:
第一个参数是要捕捉的信号,第一个参数是要捕捉的信号。
第二个参数表示我们要对信号进行的处理方式。
信号的处理一般有三种方式:
1、忽略此信号(SIG_IGN)
2、执行该信号的默认处理动作(SIG_DFL)
3、提供一个信号处理函数,要求内核在处理该信号时切换到用户态执行这个处理函数,这种方式称为捕捉(catch)一个信号
kill函数:
kill的作用是给一个进程发送信号(作用其实并不与函数名相似
pid:可能选择有以下四种
1. pid大于零时,pid是信号欲送往的进程的标识。
2. pid等于零时,信号将送往所有与调用kill()的那个进程属同一个使用组的进程。
3. pid等于-1时,信号将送往所有调用进程有权给其发送信号的进程,除了进程1(init)。
4. pid小于-1时,信号将送往以-pid为组标识的进程。
司机与售货员的例子:
#include <stdio.h>
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
void saler(int); //售票员信号处理函数
void driver(int); //司机信号处理函数
pid_t pid; //保存子进程号
int main()
{
if ((pid = fork()) == -1)
{
perror("fork");
return -1;
}
if (pid == 0) //子进程(售票员)
{
signal(SIGINT, saler); //处理SIGINT信号,不退出进程(如果不注册该信号,则会本进程会退出)。注:ctrl+c可向所有进程发送退出信号,默认退出所有进程
signal(SIGQUIT, saler); //处理SIGQUIT信号,不退出进程。注:ctrl+\可向所有进程发送退出信号,默认退出所有进程
signal(SIGUSR1, saler); //处理用户自定义信号SIGUSR1
signal(SIGTSTP, SIG_IGN); //忽略SIGTSTP信号。注:ctrl+z可向所有进程发送该信号,暂停所有进程
while (1)
pause();
}
else //父进程(司机)
{
signal(SIGINT, SIG_IGN);
signal(SIGQUIT, SIG_IGN);
signal(SIGTSTP, driver);
signal(SIGUSR1, driver);
signal(SIGUSR2, driver);
while (1)
pause();
}
return 0;
}
void saler(int no)
{
if (no == SIGINT)
kill(getppid(), SIGUSR1); //如果接收到SIGINT信号,则向父进程(司机)发送SIGUSR1信号
if (no == SIGQUIT)
kill(getppid(), SIGUSR2);
if (no == SIGUSR1)
{
printf("please get off the bus!\n");
kill(0, SIGKILL); //杀死该进程组的所有进程
}
}
void driver(int no)
{
if (no == SIGUSR1)
printf("let's gogogo!\n");
if (no == SIGUSR2)
printf("stop the bus!\n");
if (no == SIGTSTP)
kill(pid, SIGUSR1); //如果接受到SIGTSTP信号,则向子进程(售票员)发送SIGUSR1信号
}
司机与售货员:https://blog.csdn.net/zdcsky123/article/details/6714455