2 命名管道的创建
#include <sys/types.h> #include <sys/stat.h>int mkfifo(const char *pathname, mode_t mode);
3 命名管道操作
1、当以阻塞(未指定O_NONBLOCK)方式只读打开FIFO的时候,则将会被阻塞,直到有其他进程以写方式打开该FIFO。
2、类似的,当以阻塞(未指定O_NONBLOCK)方式只写打开FIFO的时候,则将会被阻塞,直到有其他进程以读方式打开该FIFO。
3、当以非阻塞方式(指定O_NONBLOCK)方式只读打开FIFO的时候,则立即返回。当只写open时,如果没有进程为读打开FIFO,则返回-1,其errno是ENXIO。
4 应用实例
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
struct fifo_cmd
{
pid_t child_pid;
char cmd[100];
};
int main(void)
{
int fd;
struct fifo_cmd cmd; int err; int n;
if((err = mkfifo("/tmp/server", 0777)) < 0)
{ if(errno != EEXIST)
{ perror("mkfido fail: ")
exit(-1);
}
}
if((fd = open("/tmp/server", O_RDONLY)) < 0)
{
perror("open fail: ");
exit(-1);
}
while(1)
{
if((n = read(fd, &cmd, sizeof(cmd))) < 0)
{
perror("read fail: ");
exit(-1);
}
if(n > 0)
{
printf("command from %d: %s\n", cmd.child_pid, cmd.cmd);
}
sleep(1);
}
}
请把这个代码编译成server。
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
struct fifo_cmd
{
pid_t pid;
char cmd[100];
};
int main(int argc, char* argv[])
{
int fd;
struct fifo_cmd cmd;
if((fd = open("/tmp/server", O_WRONLY)) < 0)
{
perror("open fail: ");
exit(-1);
}
cmd.pid = getpid();
while(1)
{
printf("%%: ");
fgets(cmd.cmd, sizeof(cmd.cmd), stdin);
cmd.cmd[strlen(cmd.cmd) - 1] = 0;
if(write(fd, &cmd, sizeof(cmd)) < 0)
{
perror("write fail: ");
exit(-1);
}
}
}
请把客户端代码编译成client。
5 总结
6