C语言双进程间信号发送出现 user defined signal 1

C语言双进程间信号发送出现 user defined signal 1

头文件

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <string.h>
#include <signal.h>

进程1

#define FIFO "/home/anyi/myfifo/fifo1"  //所用管道路径(在家目录下的myfifo下/没有文件夹的自行创建)
void func(int sig)  // 空函数,接收信号后的自定义函数
{
	//这里为空,若非要写点什么,可将下面的read剪切进来
	//但要将read中所用的所有参数都定义为全局变量
}

int main(int argc, char const *argv[])
{
    if (access(FIFO, F_OK))   //不存在管道文件就创建
    {
        int fod = mkfifo(FIFO, 0666);
        if (fod == -1)
        {
            perror("fifo failed\n");
            return -1;
        }
    }

    int fd = open(FIFO, O_RDWR,0666);   //打开管道文件
    if (fd == -1)
    {
        perror("open failed\n");
        return -1;
    }

    int my_pid = getpid();  //获取自己进程号
    int obj_pid ;   //用来接收对方进程号
    printf("my_pid:%d\n",my_pid);
    write(fd,&my_pid,sizeof(my_pid)); //把自己进程号写进管道

    signal(SIGUSR1,func); //声明接收到SIGUSR1信号后并进行func动作
    pause(); //挂起当前进程,直至收到任意信号

    read(fd,&obj_pid,sizeof(obj_pid)); //读取对方进程号
    printf("obj_pid:%d\n",obj_pid);

    close(fd);  //关闭文件
    return 0;
}

进程2

#define FIFO "/home/anyi/myfifo/fifo1"  //所用管道路径(在家目录下的myfifo下/没有文件夹的自行创建)

int main(int argc, char const *argv[])
{
    if (access(FIFO, F_OK)) //不存在管道文件就创建
    {
        int fod = mkfifo(FIFO, 0666);
        if (fod == -1)
        {
            perror("fifo failed\n");
            return -1;
        }
    }

    int fd = open(FIFO, O_RDWR,0666); //打开管道文件
    if (fd == -1)
    {
        perror("open failed\n");
        return -1;
    }

    int my_pid = getpid();   //获取自己进程号
    int obj_pid;    //用来接收对方进程号
    printf("my_pid:%d\n",my_pid);
    read(fd,&obj_pid,sizeof(obj_pid)); //读取对方进程号
    printf("obj_pid:%d\n",obj_pid);
    write(fd,&my_pid,sizeof(my_pid)); //把自己进程号写进管道

    usleep(1);   //不出现错误的关键延迟1微秒
    
    kill(obj_pid,SIGUSR1);  //发送给进程1发送SIGUSR1信号
    close(fd);  //关闭文件
    return 0;
}

user defined signal 1出现原因

这两个进程,如果先运行进程1再运行进程2不会出现问题,但先运行进程2再运行进程1,我自己的ubuntu不论怎么运行,都会出现user defined signal 1,之后找到 原因进程1:写入管道后,声明信号那1行代码,跑不过,进程2:从读取到发送信号的4行代码把声明放到前面也未能解决, 我现在想到的 方法 就是 在进程2发送信号前延迟1微秒,能解决问题。这可能和ubuntu版本,多少位,又或是自己电脑硬件有关,深层原因未知。


版权声明:本文为AnYi_2333原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。