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版权协议,转载请附上原文出处链接和本声明。