操作系统

讲得比较清楚的进程相互通信的一个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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值