我试图在C
(使用CygWin和Dev-C ++)中启动一个简单的管道来传递父项和单个子项之间的值。这是parent
代码(pipesnd.c):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int FIFO[2];
char *msg = "This is a test message";
char str[10];
if (pipe(FIFO) == -1)
{
printf("cannot create pipe\n");
exit(1);
}
write(FIFO[1], msg, strlen(msg));
sprintf(str, "%d", FIFO[0]);
printf("I am the parent and this was in the pipe: %s \n", str);
fflush(stdout);
switch (fork())
{
case 0:
execl("c:/Dev-Cpp/Lift 2/pipercv", "pipercv", str, NULL);
exit(1);
case -1:
perror("fork() failed:");
exit(2);
default:
}
exit(0);
}
child
代码(pipercv.c):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NBUF 100
int main(int argc, char *argv[])
{
int fd;
char buf[NBUF];
if (argc != 2)
{
printf("expect pipercv fd\n");
exit(1);
}
fd = atoi(argv[1]);
read(fd, buf, 20);
buf[20] = '\0';
printf("I am the child and this was in the pipe: %s \n", buf);
fflush(stdout);
sleep(10);
}
结果:
如何在子级和父级(双向)中传递/查看整个邮件?
答案 0 :(得分:0)
问题是您从buf中读取了20个字符,然后将\0
添加为第20个字符,最后输出结果。你的信息
This is a test message
包含更多字符。
答案 1 :(得分:0)
传输的字符串实际上是24字节&#39;这是测试消息&#39; +尾随NUL字节。
只读取20个字符是错误的主要部分。
在子节点中建议将缓冲区初始化为所有NUL字节:
char buf[NBUF] = {'\0'};
然后在读取数据后不需要插入终止NUL字节。
为了确保在子节点中读取正确的字节数,建议子节点的第二个命令行参数指示要读取的字节数。
使用read()语句中的传入字节计数,而不是使用具有选择超时的select / read循环。