【发布时间】:2018-04-15 10:11:56
【问题描述】:
我正在尝试实现两个进程之间的基本通信。我打算让每个进程接收一条信息,然后再传回一条信息。我是管道新手,因此尝试使用此代码示例进行此操作: How to send a simple string between two programs using pipes?
我设置了代码,它工作正常,然后我复制了第二个管道的代码,以便接收另一个整数。但是我的第二个管道不传输整数,程序收到一个 0 代替。
program1.c:
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#define MAX_BUF 1024
int main()
{
int fd; // file descriptor
int fd_b;
int data = 5;
int buf; // buffer from fifo
char * fifo_one = "/tmp/fifo_one";
char * fifo_two = "/tmp/fifo_two";
// create fifo
mkfifo(fifo_one, 0666);
// write to FIFO
fd = open(fifo_one, O_WRONLY);
write(fd, &data, sizeof(&data));
close(fd);
// remove FIFO
unlink(fifo_one);
// receive from FIFO
fd_b = open(fifo_two, O_RDONLY);
read(fd_b, &buf, MAX_BUF);
printf("Received: %d\n", buf);
close(fd_b);
return 0;
}
program2.c:
#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
#define MAX_BUF 1024
int main()
{
int fd; // file descriptor
int fd_b;
char * fifo_one = "/tmp/fifo_one";
char * fifo_two = "/tmp/fifo_two";
int buf; // buffer from fifo
int ret_dat; // return data
// receive data from fifo
fd = open(fifo_one, O_RDONLY);
read(fd, &buf, MAX_BUF);
printf("Received: %d\n", buf);
close(fd);
// decide return
if (buf == 5) {
ret_dat = 10;
}
// send data back
// create fifo
mkfifo(fifo_two, 0666);
// write to FIFO
fd_b = open(fifo_two, O_WRONLY);
write(fd_b, &ret_dat, sizeof(&ret_dat));
close(fd_b);
// remove FIFO
unlink(fifo_sendBal);
return 0;
}
第二个程序接收到5,但是没有成功发回10,
我知道时间会影响 IPC,所以我尝试在某些事件后使用睡眠,但我无法让它工作。
【问题讨论】:
-
您应该添加一些错误检查 (
perror(3))。 -
无关:
write(fd, &data, sizeof(&data));非常错误,您不需要与号。只需write(fd, &data, sizeof data);即可。[您还应该检查从 read() 和 write() 获得的返回值] 3) 而read(fd_b, &buf, MAX_BUF);是灾难的根源。 -
read()和write()读取或写入最多请求的字节数。他们可以并且经常确实返回小于请求值的数字。可以安全忽略返回值的用途并不多,尤其是在您必须处理错误时。
标签: c file ipc named-pipes fifo