Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Tee模拟程序只将初始输入写入文件,忽略所有顺序输入_C_Linux_Operating System - Fatal编程技术网

C Tee模拟程序只将初始输入写入文件,忽略所有顺序输入

C Tee模拟程序只将初始输入写入文件,忽略所有顺序输入,c,linux,operating-system,C,Linux,Operating System,所以我有一个mytee程序(功能要少得多)。尝试学习如何使用管道/儿童/等 (1) 我喜欢吹烟斗 (2) 创建文件 (3) 叉子 (4) 父级不扫描以获取文本 (5) 将文本发送到管道 (6) 子级接收并将其写入文件 ->#在用户写入“.”之前,4应该是一个循环。 ->#6应该继续写新词,但有些地方出现了故障 我认为可能的一些事情: 1.我的权限有问题(但有O_APPEND,不确定我还需要什么) 2.父do while循环中可能有问题,它应该将消息发送到管道(fd[1]) 3. #6.我强烈认为

所以我有一个mytee程序(功能要少得多)。尝试学习如何使用管道/儿童/等

(1) 我喜欢吹烟斗
(2) 创建文件
(3) 叉子
(4) 父级不扫描以获取文本
(5) 将文本发送到管道
(6) 子级接收并将其写入文件

->#在用户写入“.”之前,4应该是一个循环。
->#6应该继续写新词,但有些地方出现了故障

我认为可能的一些事情:
1.我的权限有问题(但有O_APPEND,不确定我还需要什么)
2.父do while循环中可能有问题,它应该将消息发送到管道(fd[1])
3. #6.我强烈认为我的问题出在哪里。在首次写入之后,它不会继续写入。我不确定是否需要以某种方式跟踪已写入的字节大小,但如果是这样,我希望最后一条消息会出现,而不是第一条

我现在几乎不知所措

我使用

   ./mytee test1
代码:

它不能正常退出。我认为这孩子陷入了圈套 以及test1的内容:

qwe

我发现有几个问题可能导致这种行为

首先,您的循环条件看起来不正确。当前,如果读取单个字节,它将终止。将其更改为:

while (read_data > 0);
我看到的另一个问题是,您写入的文件比打开的文件多。确保循环到
argc-1
,而不是
argc

for (i=0; i<argc-1; i++)

for(i=0;i使用OP处理此问题,据报道问题是无条件地写入
msg
的所有20字节,而不仅仅是其中包含的以NUL结尾的字符串。建议的最小修复方法:更改

scanf("%s",msg);
write(fd[1],msg,sizeof(msg));


它对我来说还可以(在ubuntu上),模化小于20字节的输入行会导致输出文件中先前读取行的NUL和剩余字符,因为父级无条件写入20字节。您能否提供示例输入和输出文件,以显示您遇到的问题?不
tee
只是读取
stdin
并写入任何在达到eof之前,要同时读取
stdout
和一个文件吗?我认为您的程序做了一些不同的事情。另外,由于您将问题标记为“linux”,您是否知道存在两个系统调用(
tee
splice
)这是一个有点类似于tee-in功能的程序,它肯定不是一个完整功能的tee。它只是一次接收一条scanf消息,并将其写入所有指定的文件。我确实听说过拼接,但这是一个我需要弄清楚这东西是如何工作的,我在u理解这里出了什么问题。使用
write(fd[1],msg,sizeof(msg));
,表达式
sizeof(msg)
是常量。如果msg声明为
char msg[20],则始终为20
,不管msg包含的数据是什么。它会写入以前写入的NUL和字符,因为msg永远不会被归零。如果您键入
第一行
,然后键入
第二行
,第二次写入的是
2nd\0t行\0\0\0\0\0\0\0\0
。后续消息会被写入,但程序会被写入如果对NUL的存在感到困惑,那么读取输出文件可能不会显示所有内容。我对这两个文件都做了更改-这没有任何效果。主for循环确实有I
for (i=0; i<argc-1; i++)
scanf("%s",msg);
write(fd[1],msg,sizeof(msg));
scanf("%19s",msg);
write(fd[1],msg,strlen(msg));