写出三种进程间通信的代码示例
1. 无名管道
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
int pipefd[2];
pid_t pid;
char buffer[20];
// 创建无名管道
if (pipe(pipefd) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}
// 创建子进程
pid = fork();
if (pid < 0) {
perror("fork");
exit(EXIT_FAILURE);
}
if (pid > 0) {
// 父进程写入数据到管道
close(pipefd[0]); // 关闭读端
write(pipefd[1], "Hello, child!", 14);
close(pipefd[1]); // 关闭写端
wait(NULL); // 等待子进程结束
exit(EXIT_SUCCESS);
} else {
// 子进程从管道读取数据
close(pipefd[1]); // 关闭写端
read(pipefd[0], buffer, sizeof(buffer));
printf("Child received: %s\n", buffer);
close(pipefd[0]); // 关闭读端
exit(EXIT_SUCCESS);
}
}
2.有名管道
//1、create.c创建管道文件
#include<myhead.h>
int main(int argc, const char *argv[])
{
//调用mkfifo函数创建一个管道文件
if(mkfifo("myfifo", 0664) == -1)
{
perror("mkfifo error");
return -1;
}
getchar(); //阻塞
system("rm myfifo"); //删除当前目录下的管道文件
return 0;
}
//2、snd.c:发送端进程
#include<myhead.h>
int main(int argc, const char *argv[])
{
//1、打开管道文件
int wfd= -1;
if((wfd = open("./myfifo", O_WRONLY)) == -1)
{
perror("wfd open error");
return -1;
}
//向管道文件中写入数据
char wbuf[128] = "";
while(1)
{
printf("请输入>>>");
fgets(wbuf, sizeof(wbuf), stdin); //从终端输入字符串
wbuf[strlen(wbuf) - 1] = 0;
//将字符串写入管道中
write(wfd, wbuf, sizeof(wbuf));
//判断是否要退出
if(strcmp(wbuf, "quit") == 0)
{
break;
}
}
//关闭管道文件
close(wfd);
return 0;
}
//3、rcv.c:读取端程序
#include<myhead.h>
int main(int argc, const char *argv[])
{
//1、打开管道文件
int rfd= -1;
if((rfd = open("./myfifo", O_RDONLY)) == -1)
{
perror("rfd open error");
return -1;
}
//从管道文件中读取数据
char rbuf[128] = "";
while(1)
{
//清空内容
bzero(rbuf, sizeof(rbuf));
//将数据从管道文件中读取出来
read(rfd, rbuf, sizeof(rbuf));
printf("收到一条消息:%s\n", rbuf);
//判断是否要退出
if(strcmp(rbuf, "quit") == 0)
{
break;
}
}
//关闭管道文件
close(rfd);
return 0;
}
3.信号
#include<myhead.h>
//定义信号处理函数
void handler(int signo)
{
//判断传过来的是哪个信号
if(signo == SIGINT)
{
printf("用户按下了ctrl + c键,被我捕获了\n");
}
}
int main(int argc, const char *argv[])
{
/*将SIGINT信号忽略
if(signal(SIGINT, SIG_IGN) == SIG_ERR)
{
perror("signal error");
return -1;
}*/
/*将SIGINT信号捕获,干其他事情
if(signal(SIGINT, handler) == SIG_ERR)
{
perror("signal error");
return -1;
}*/
//将SIGINT信号默认处理
if(signal(SIGINT, SIG_DFL) == SIG_ERR)
{
perror("signal error");
return -1;
}
while(1)
{
sleep(1);
printf("我真的还想再活五百年。。。\n");
}
return 0;
}