网站 界面,协会网站建设的作用,建设监理工程公司网站,wordpress提示不安全#x1f436;博主主页#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️#x1f525;专栏系列#xff1a;线性代数#xff0c;C初学者入门训练#xff0c;题解C#xff0c;C的使用文章#xff0c;「初学」C#xff0c;linux #x1f525;座右铭#xff1a;“不要等到什么都没有了… 博主主页ᰔᩚ. 一怀明月ꦿ ❤️专栏系列线性代数C初学者入门训练题解CC的使用文章「初学」Clinux 座右铭“不要等到什么都没有了才下定决心去做” 大家觉不错的话就恳求大家点点关注点点小爱心指点指点 目录
命名管道
mkfifo指令
mkfifo系统调用
命名管道实践客户端server与服务端client进行通信
client.c
server.cc
Comm.h共享管道文件的名字
Makefile 命名管道 匿名管道只能具有血缘关系的进程间通信如果我想要让两个毫不相干的进程进行通信得需要命名管道 mkfifo指令 mkfifo是Linux/Unix中的一个命令用于创建一个命名管道named pipe文件。命名管道可以让进程在不同的时间以非常高效的方式进行通信而无需使用临时文件或共享内存等机制。 命名管道是一种特殊类型的文件它提供了一种先进先出FIFO的数据传输方法。它允许两个或多个进程之间进行通信即一个进程往管道写入数据另一个进程从管道中读取数据。 mkfifo命令的基本语法如下 mkfifo [option]... filename...
其中option是一些可选参数filename是要创建的命名管道文件名。例如要创建一个名为mypipe的命名管道文件可以使用以下命令
mkfifo mypipe
创建成功后可以使用ls命令查看该文件可以发现它的类型是p
$ ls -l mypipe
prw-r--r-- 1 user user 0 Feb 2 16:20 mypipe
其中文件类型p表示它是一个命名管道文件。 通过命名管道进程之间可以进行简单的IPC通信例如一个进程可以向管道中写入数据另一个进程则可以从管道中读取数据。在使用管道通信时需要注意以下几点 * 同一时间只能有一个进程打开管道进行读写否则会导致竞争条件。 * 写入进程在向管道中写入数据时如果管道已满写入操作将被阻塞直到其他进程从管道中读取数据为止。 * 读取进程在从管道中读取数据时如果管道为空读取操作将被阻塞直到另一个进程向管道中写入数据为止。 需要注意的是命名管道与匿名管道通过pipe系统调用创建的管道不同它们具有不同的用途和限制。命名管道允许不同进程之间进行通信而匿名管道只能在父子进程之间进行通信。 事例 [BCHhcss-ecs-6176 1_25]$ mkfifo fifo
[BCHhcss-ecs-6176 1_25]$ ll
总用量 84
prw-rw-r-- 1 BCH BCH 0 2月 1 22:05 fifo
-rw-rw-r-- 1 BCH BCH 90 1月 31 18:43 Makefile
-rwxrwxr-x 1 BCH BCH 70792 2月 1 17:22 processpool
-rw-rw-r-- 1 BCH BCH 3605 2月 1 17:22 processpool.cc
-rw-rw-r-- 1 BCH BCH 1547 2月 1 16:46 task.hpp 如果两个进程都需要访问同一文件还需要把一份文件加载两次到内存吗 是不需要的只需要加载一次就行了但是不同的进程有自己的文件管理结构 例如 mkfifo系统调用 mkfifo() 是 Linux 中的一个系统调用用于创建一个命名管道Named Pipe。命名管道是一种特殊类型的文件可以在不同进程间进行通信类似于匿名管道但有一个重要的区别命名管道在文件系统中有一个相关联的路径名因此可以在不同的进程中通过路径名进行访问。 mkfifo() 函数的原型通常在头文件 unistd.h 中声明 #include unistd.h
int mkfifo(const char *pathname, mode_t mode);
参数说明
pathname指定要创建的命名管道的路径名。
mode指定创建的管道的权限模式通常采用八进制表示比如 0666。
mkfifo() 函数成功时返回 0失败时返回 -1并设置相应的错误码可以通过 errno 变量获取错误信息。
命名管道的创建通常与 open() 函数结合使用用于打开管道以进行读取或写入操作。 示例 #include stdio.h
#include stdlib.h
#include unistd.h
#include fcntl.h
int main() {const char *fifo_path /tmp/myfifo; // 命名管道的路径名// 创建命名管道if (mkfifo(fifo_path, 0666) -1) {perror(mkfifo);exit(EXIT_FAILURE);}printf(Named pipe created successfully.\n);return 0;
} 上述示例中创建了一个命名管道 /tmp/myfifo权限为 0666。如果创建成功则输出 Named pipe created successfully.否则输出相应的错误信息。 命名管道实践客户端server与服务端client进行通信 client.c #include iostream
#include sys/types.h
#include sys/stat.h
#include cstring
#include fcntl.h
#include unistd.h
#include comm.husing namespace std;int main(){int wfd open(FILENAME, O_WRONLY);if (wfd 0){cerr error: errno errstring : strerror(errno) endl;return 1;}string message;while (true){cout please enter# ;getline(cin, message);ssize_t s write(wfd, message.c_str(), message.size());if (s 0){cerr error: errno errstring : strerror(errno) endl;break;}}close(wfd);return 0;
}server.cc #include iostream
#include sys/types.h
#include sys/stat.h
#include cstring
#include fcntl.h
#include unistd.h
#include comm.husing namespace std;// 创建管道文件创建成功返回真否则返回假
bool Mkfifo(){int n mkfifo(FILENAME, 0666);if (n 0){cerr error: errno errstring : strerror(errno) endl;return false;}return true;
}int main(){
// 使用了goto语句因为我不想每次打开客户端都去删除原来的管道文件因为每次打开客户端都会创建
// 管道文件这样就会报错文件已存在所以我们需要管道文件已存在我们就不创建管道文件不存在才创建
// 管道文件
start:int rfd open(FILENAME, O_RDONLY);if (rfd 0){cerr error: errno errstring : strerror(errno) endl;if (Mkfifo())goto start;elsereturn 2;}char buffer[1024];while (true){ssize_t s read(rfd, buffer, sizeof(buffer) - 1);if (s 0){buffer[s] 0;cout client say# buffer endl;}else if (s 0) // 如果写端关闭了{break;}}close(rfd);return 0;
}Comm.h共享管道文件的名字 #pragma once#define FILENAME .fifo//隐藏文件 Makefile .PHONY:all
all:client serverclient:client.cc
g -o $ $^ -stdc11server:server.cc
g -o $ $^ -stdc11.PHONY:clean
clean:
rm -f client server .fifo如果大家还有不懂或者建议都可以发在评论区我们共同探讨共同学习共同进步。谢谢大家