作业1:有名管道,创建两个发送接收端,父进程写入管道1和管道2,子进程读取管道2和管道1.
//send1.c
#include <myhead.h>
int main(int argc, char const *argv[])
{
pid_t pid = fork();
if (mkfifo("./fifo1", 0664) == -1 && errno != EEXIST)
{
perror("fifo1");
return -1;
}
if (mkfifo("./fifo2", 0664) == -1 && errno != EEXIST)
{
perror("fifo2");
return -1;
}
if (pid > 0) // 父进程
{
char buff[1024];
int send = open("./fifo1", O_WRONLY);
if (send == -1)
{
perror("send");
return -1;
}
while (1)
{
// memset(buff, 0, sizeof(buff));
ssize_t len = read(0, buff, sizeof(buff));
if (len > 0 && buff[len - 1] == '\n') {
buff[len - 1] = '\0';
} else {
buff[len] = '\0';
}
write(send, buff, len);
if (strcmp(buff, "quit") == 0)
{
break;
}
}
close(send);
exit(EXIT_SUCCESS);
}
else if (pid == 0) // 子进程
{
char buff[1024];
int recv = open("./fifo2", O_RDONLY);
if (recv == -1)
{
perror("recv");
close(recv);
return -1;
}
while (1)
{
// memset(buff, 0, sizeof(buff));
ssize_t len = read(recv, buff, sizeof(buff));
if (len > 0 && buff[len - 1] == '\n') {
buff[len - 1] = '\0';
} else {
buff[len] = '\0';
}
write(1, buff, len);
write(1, "\n", 1); // 添加换行符
if (strcmp(buff, "quit") == 0)
{
break;
}
}
close(recv);
exit(EXIT_SUCCESS);
}
else
{
perror("fork");
return -1;
}
return 0;
}
// send2.c
#include <myhead.h>
int main(int argc, char const *argv[])
{
pid_t pid = fork();
if (mkfifo("./fifo1", 0664) == -1 && errno != EEXIST)
{
perror("fifo1");
return -1;
}
if (mkfifo("./fifo2", 0664) == -1 && errno != EEXIST)
{
perror("fifo2");
return -1;
}
if (pid > 0) // 父进程
{
char buff[1024];
int send = open("./fifo2", O_WRONLY);
if (send == -1)
{
perror("send");
return -1;
}
while (1)
{
// memset(buff, 0, sizeof(buff));
ssize_t len = read(0, buff, sizeof(buff));
if (len > 0 && buff[len - 1] == '\n') {
buff[len - 1] = '\0';
} else {
buff[len] = '\0';
}
write(send, buff, len);
if (strcmp(buff, "quit") == 0)
{
break;
}
}
close(send);
exit(EXIT_SUCCESS);
}
else if (pid == 0) // 子进程
{
char buff[1024];
int recv = open("./fifo1", O_RDONLY);
if (recv == -1)
{
perror("recv");
close(recv);
return -1;
}
while (1)
{
// memset(buff, 0, sizeof(buff));
ssize_t len = read(recv, buff, sizeof(buff));
if (len > 0 && buff[len - 1] == '\n') {
buff[len - 1] = '\0';
} else {
buff[len] = '\0';
}
write(1, buff, len);
write(1, "\n", 1); // 添加换行符
if (strcmp(buff, "quit") == 0)
{
break;
}
}
close(recv);
exit(EXIT_SUCCESS);
}
else
{
perror("fork");
return -1;
}
return 0;
}