进程间通讯
server
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdlib.h>
#include<unistd.h>
// #define ERR_EXIT(m)\ //将报错与退出包成一个宏
// do\
// {\
// perror(m);\
// exit(EXIT_FAILURE);\
// }while(0)
int main()
{
umask(0);
/*
umask函数用来修改进程的umask。参数mask可以直接取数值也可以为open系统调用第三个参数mode的11个宏或他们的组合
S_IRWXU 00700 user (file owner) has read, write and execute permission
S_IRUSR 00400 user has read permission
S_IWUSR 00200 user has write permission
S_IXUSR 00100 user has execute permission
S_IRWXG 00070 group has read, write and execute permission
S_IRGRP 00040 group has read permission
S_IWGRP 00020 group has write permission
S_IXGRP 00010 group has execute permission
S_IRWXO 00007 others have read, write and execute permission
S_IROTH 00004 others have read permission
S_IWOTH 00002 others have write permission
S_IXOTH 00001 others have execute permission
例:umask(0);//不屏蔽任何权限
umask(S_IRWXO);//屏蔽其他用户的所有权限
*/
if(mkfifo("mypipe",0644)<0) //创建一个命名管道
//ERR_EXIT("mkfifo");
printf("error");
int rfd=open("mypipe",O_RDONLY);
if(rfd<0)
//ERR_EXIT("open");
printf("error");
char buf[1024];
while(1)
{
buf[0]=0;
printf("Please wait....\n");
size_t s=read(rfd,buf,sizeof(buf)-1);
if(s>0)
{
buf[s]=0;
printf("client say# %s\n",buf);
}
else if(s==0)
{
printf("client quit,exit now!\n");
exit(EXIT_SUCCESS);
}
else
{
//ERR_EXIT("read");
}
}
close(rfd);
return 0;
}
client
#include<stdio.h>
#include<sys/types.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<string.h>
// #define ERR_EXIT(m)\
// do\
// {\
// perror(m);\
// exit(EXIT_FAILURE);\
// }while(0)
int main()
{
int wfd=open("mypipe",O_WRONLY);
if(wfd<0)
{
// ERR_EXIT("open");
}
char buf[1024];
int a=100; //message number
while(a--)
{
buf[0]=0;
printf("Please Enter# ");
fflush(stdout);
size_t s=read(0,buf,sizeof(buf)-1);
if(s>0)
{
buf[s]=0;
write(wfd,buf,strlen(buf));
}
else if(s<=0)
{
// ERR_EXIT("read");
}
}
close(wfd);
return 0;
}
通讯效果: