我用命名管道写的程序来实现两个进程间的通信,想知道为什么老是不能得到自己想要的结果!!

我用命名管道写的程序来实现两个进程间的通信,想知道为什么老是不能得到自己想要的结果!!,第1张

("\\\\.\\pipe\\ethan",PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED,

0,1,1024,1024,0,

NULL)

由于FIFO是作为一个有名文件存在于文件系统中的,需要确认你是否有创建文件的权限。看你上面写的文件的路径好像有问题哦。

下面是UNIX环境命名管道的例子。

头文件:

#include<unistd.h>

#include<stdlib.h>

#include<stdio.h>

#include<string.h>

#include<fcntl.h>

#include<limits.h>

#include<sys/types.h>

#include<sys/stat.h>

#include<ctype.h>

#define SERVER_FIFO_NAME "/opt/chengxs/temp/fifo/serv_fifo" /*服务专用的fifo*/

#define CLIENT_FIFO_NAME "/opt/chengxs/temp/fifo/client_%d_fifo" /*客户专用的fifo*/

struct data_to_pass

{

pid_t client_pid

char text_data[256-1]

}

客户端:

/*

*客户程序

*/

#include"cliserv.h"

int main()

{

int server_fifo_fd,client_fifo_fd

struct data_to_pass my_request

int times_to_send

char client_fifo_name[256]

pid_t mypid

/*打开服务管道*/

server_fifo_fd = open(SERVER_FIFO_NAME,O_WRONLY)

if(server_fifo_fd == -1)

{

perror("Sorry,no server")

exit(1)

}

/*创建以进程ID命名的客户接收管道*/

mypid = getpid()

sprintf(client_fifo_name,CLIENT_FIFO_NAME,mypid)

if(mkfifo(client_fifo_name,0777) == -1)

{

perror(client_fifo_name)

exit(2)

}

/*向服务进程连续发送和接收五次数据*/

for(times_to_send=0times_to_send<5times_to_send++)

{

sprintf(my_request.text_data,"Hello from %d,%d",mypid,times_to_send)

my_request.client_pid = mypid

/*向服务进程发出请求*/

printf("%d send: %s,",mypid,my_request.text_data)

write(server_fifo_fd,&my_request,sizeof(my_request))

/*从服务进程接收回答,打开客户有名管道*/

client_fifo_fd = open(client_fifo_name,O_RDONLY)

if(client_fifo_fd!=-1)

{

if(read(client_fifo_fd,&my_request,sizeof(my_request))>0)

{

printf("%d received: %s\n",mypid,my_request.text_data)

}

close(client_fifo_fd)

}

}

close(server_fifo_fd)

unlink(client_fifo_fd)

exit(0)

}

服务端:

/*

*服务程序

*/

#include"cliserv.h"

int main()

{

int server_fifo_fd,client_fifo_fd

struct data_to_pass my_data

int nbytes

char client_fifo_name[256]

char * tmp_char_ptr

/*创建并打开服务FIFO*/

mkfifo(SERVER_FIFO_NAME,0777)

server_fifo_fd = open(SERVER_FIFO_NAME,O_RDONLY)

if(server_fifo_fd == -1)

{

perror("Server info failed!")

exit(1)

}

/*客户请求排队*/

sleep(10)

do

{

/*接收来自客户的请求*/

nbytes = read(server_fifo_fd,&my_data,sizeof(my_data))

if(nbytes>0)

{

/*处理客户请求*/

tmp_char_ptr = my_data.text_data

while(*tmp_char_ptr)

{

*tmp_char_ptr = toupper(*tmp_char_ptr)

tmp_char_ptr++

}

/*返回处理过的数据*/

sprintf(client_fifo_name,CLIENT_FIFO_NAME,my_data.client_pid)

client_fifo_fd = open(client_fifo_name,O_WRONLY)

if(client_fifo_fd != -1)

{

write(client_fifo_fd,&my_data,sizeof(my_data))

close(client_fifo_fd)

}

}

}while(nbytes>0)

close(server_fifo_fd)

unlink(SERVER_FIFO_NAME)

return 0

}

运行时:

先运行服务端程序,在运行客户端程序。

什么是Named Pipes

Named Pipe(命名管道)是一种有名字的, 建立在pipe server和一个(或多个)pipe client之间的单向或双向的通信管道. 一个命名管道的所有实例都会共享一个相同的pipe name, 但是每个实例都有他自己的缓冲区和句柄(handle), 并且为客户端/服务器的通讯提供一个单独的导管. 这种对实例的使用使得多个pipe client同时地使用相同的named pipe成为可能.

任何进程都可以访问命名管道, 都可以接受安全检查, 这使得命名管道成为关联进程和非关联进程之间通信的一种简单方式.

任何进程都可以既做server, 又做client, 这使得点对点的对等通信成为可能. 正如这里用到的那样, 术语"pipe server”指的是创建named pipe的进程, 术语"pipe client"指的是连接到一个named pipe实例的进程. 供服务器端实例化一个命名管道的函数叫做CreateNamedPipe. 服务器端接受一个连接请求的函数叫做ConnectNamedPipe. 客户端是通过CreateFile 或 CallNamedPipe 函数来连接到命名管道的.

命名管道可以被用来在同一台机器的不同进程间提供通信, 或者在不同机器间通过网络为提供进程间通信. 如果一个服务器处于运行状态, 所有命名管道都可以是可以通过远程连接的. 如果你仅想要在本地使用named pipe, 你可以拒绝NT AUTHORITY\NETWORK帐号的访问, 或者去使用本地的local RPC.

Named Pipe是Server Message Block (SMB) 套件的一个网络协议, 基于Inter-process communication (IPC)共享. 使用SMB的IPC可以无缝的, 透明的转送用户的认证信息给命名管道. 即, 安全检查对于named pipe是完全可以的.


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8084405.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-13
下一篇2023-04-13

发表评论

登录后才能评论

评论列表(0条)

    保存