所以我有一个mytee程序(功能少得多)。试图学习如何使用管道/儿童/等
(1)我做管道
(2)创建文件
(3)叉子
(4)父母做scanf得到文本
(5)将文本发送到管道
(6)孩子接收并将其写入文件
- > #4应该是一个循环,直到用户写'。' - > #6应继续编写新行,但某处有故障。
我认为可能有些事情:
1.我的权限有问题(但O_APPEND就在那里,不知道我还需要什么)
2.父进行循环可能有问题,应该将msg发送到管道(fd [1])
3.#6我强烈认为我的问题所在。在初始写入之后它没有,继续写。我不确定我是否需要以某种方式跟踪已经写入的字节大小,但如果是这种情况,我希望最后的消息不是第一个。
我现在非常茫然
我使用
运行它 ./mytee test1
代码:
ret = pipe (fd);
if (ret == -1)
{
perror ("pipe");
return 1;
}
for (i=0;i<argc-1;i++) {
if ((filefd[i] = open(argv[i+1], O_CREAT|O_TRUNC|O_WRONLY|O_APPEND, 0644)) < 0) {
perror(argv[i]); /* open failed */
return 1;
}
}
pid = fork();
if (pid==0) /* child */
{
int read_data;
do {
read_data = read(fd[0], buffer, sizeof(buffer));
for(i=0;i<argc;i++) {
write(filefd[i], buffer, read_data);
}
} while (read_data > 1);
for (i=0; i<argc; i++)
close(filefd[i]);
return 0;
}
else { /* parent */
char msg[20];
do{
scanf("%s",msg);
write(fd[1],msg,sizeof(msg));
}while (strcmp(msg,".")!=0);
while ((pid = wait(&status)) != -1)
fprintf(stderr, "process %d exits with %d\n", pid, WEXITSTATUS(status));
return 0;
}
添加输出:
$ ./a.out test1
qwe
asd
zxc
.
^C
它无法正常退出。我认为这个孩子陷入了困境 和test1的内容:
qwe
答案 0 :(得分:1)
与OP一起解决这个问题,据报道问题是无条件写入msg
的所有20个字节,而不是仅包含其中包含的NUL终止字符串。建议的最小修复:更改
scanf("%s",msg);
write(fd[1],msg,sizeof(msg));
到
scanf("%19s",msg);
write(fd[1],msg,strlen(msg));
答案 1 :(得分:0)
我看到了一些可能导致这种行为的问题。
首先,你的循环条件看起来不正确。目前,如果读取单个字节,它将终止。将其更改为:
while (read_data > 0);
我看到的另一个问题是你写的文件多于你打开的文件。确保循环到argc-1
,而不是argc
:
for (i=0; i<argc-1; i++)