进程间通信-信号(一个进程往另一个进程发送信号)

程序功能:

signal.c程序接收两个信号,SIGUSR1,SIGUSR2,接收到SIGUSR1之后,执行sig_usr_close函数,打印,并将全局变量m_switch置为0;接收到SIGUSR2之后,执行sig_usr_open函数,打印,并将m_switch置为1。

kill.c程序主要发送两个信号,SIGUSR1,SIGUSR2。

 

1、信号发送函数-kill()

#include <sys/types.h> 

#include <signal.h> 

int kill(pid_t pid,int signo) 

 

2、信号接收函数

void (*signal(int signum, void (*handler)(int)))(int);

//signal.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>

int m_switch = 1;
void sig_usr_close(int sig);
void sig_usr_open(int sig);

int main()
{
    if(signal(SIGUSR1, sig_usr_close) == SIG_ERR)
    {
        printf("signal error\n");
    }
    if(signal(SIGUSR2, sig_usr_open) == SIG_ERR)
    {
        printf("signal error\n");
    }
    printf("%d\n", getpid());
    
    while(1)
    {
        if(m_switch == 1)
        {
            printf("hello\n");
        }
        sleep(1);
    }
    return 0;
}
void sig_usr_close(int sig)
{
    printf("reveive SIGUSER1\n");
    m_switch = 0;
}
void sig_usr_open(int sig)
{
    printf("reveive SIGUSER2\n");
    m_switch = 1;
}
//kill.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <signal.h>

void kill_usr_close(int pid);
void kill_usr_open(int pid);

int main(int argc)
{
    int a;
    scanf("%d", &a);
    kill_usr_close(a);
    sleep(5);
    kill_usr_open(a);
    return 0;
}
void kill_usr_close(int pid)
{
    kill(pid, SIGUSR1);
}
void kill_usr_open(int pid)
{
    kill(pid, SIGUSR2);
}

结果:signal函数会收到两次信号,第一次收到信号后,停止打印hello,收到第二次信号后,继续打印hello

参考:https://blog.csdn.net/qq_37192076/article/details/80410065 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个使用QT信号量方式进行进程间通信的例程: 首先,在发送进程中,我们需要创建一个信号量对象,并对其进行加锁操作,然后将数据写入共享内存中: ```cpp #include <QSystemSemaphore> #include <QSharedMemory> #include <QBuffer> // 创建信号量对象 QSystemSemaphore semaphore("my_semaphore", 1, QSystemSemaphore::Create); // 加锁 if (!semaphore.acquire()) { qDebug() << "Cannot acquire semaphore."; return; } // 创建共享内存对象 QSharedMemory sharedMemory("my_shared_memory"); // 打开共享内存 if (!sharedMemory.create(sizeof(int))) { qDebug() << "Cannot create shared memory segment."; semaphore.release(); return; } // 将数据写入共享内存中 QBuffer buffer; QDataStream out(&buffer); out << static_cast<int>(42); const QByteArray data = buffer.data(); memcpy(sharedMemory.data(), data.constData(), qMin(sharedMemory.size(), data.size())); // 解锁 semaphore.release(); ``` 然后,在接收进程中,我们需要打开信号量和共享内存,并对信号量进行加锁操作,然后从共享内存中读取数据: ```cpp #include <QSystemSemaphore> #include <QSharedMemory> #include <QBuffer> // 创建信号量对象 QSystemSemaphore semaphore("my_semaphore", 1, QSystemSemaphore::Open); // 加锁 if (!semaphore.acquire()) { qDebug() << "Cannot acquire semaphore."; return; } // 创建共享内存对象 QSharedMemory sharedMemory("my_shared_memory"); // 打开共享内存 if (!sharedMemory.attach()) { qDebug() << "Cannot attach shared memory segment."; semaphore.release(); return; } // 从共享内存中读取数据 QBuffer buffer; const char *data = static_cast<const char*>(sharedMemory.constData()); buffer.setData(data, sharedMemory.size()); int value; QDataStream in(&buffer); in >> value; qDebug() << "Received value:" << value; // 解锁 semaphore.release(); ``` 以上例程中,我们创建了一个名为“my_semaphore”的信号量对象和一个名为“my_shared_memory”的共享内存对象,然后在发送进程中对信号量进行加锁操作,写入一个整数值到共享内存中,接着在接收进程中对信号量进行加锁操作,从共享内存中读取整数值并输出,最后解锁信号量。 需要注意的是,信号量方式的进程间通信需要保证多个进程都能够访问同一个信号量对象,因此需要使用相同的信号量名称。在访问共享内存时也需要进行同步控制,以避免数据竞争问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值