【发布时间】:2022-01-10 19:35:14
【问题描述】:
我正在尝试通过两个不同的进程(父亲和孩子)将两个字符串逐个字符地写入标准输出,强制使用 read() 和 write(),代码如下:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
char buf1[100];
char buf2[100];
int i;
pid_t t;
int main()
{
printf("String1:\n");
read(0, buf1, 100);
printf("String2:\n");
read(0, buf2, 100);
t = fork();
if (t > 0) {
wait(NULL);
for (i = 0; i < strlen(buf2); i++) {
write(1, &buf2[i], 1);
sleep(1);
}
}
else {
for (i = 0; i < strlen(buf1); i++) {
write(1, &buf1[i], 1);
sleep(1);
}
exit(0);
}
return(0);
}
我设法让两个进程分别将一个字符串写入标准输出,但我未能将这两个字符串合并为一个。我尝试使用 ANSI 转义码让光标为第一个字符串结束的第二个字符串做好准备,但是如何将它们集成到 write() 内的缓冲区中?
现在,通过上面提到的代码,我可以得到这个输出:
String1:
Hyper
String2:
loop
Hyper
loop
我想获得:
String1:
Hyper
String2:
loop
Hyperloop
提前谢谢你
【问题讨论】:
-
从您阅读的字符串中删除换行符,然后在完成时添加一个。此外,您应该使用来自
read()和write()的返回值来确定输入和输出的长度。你对短字符串没问题——但如果有人输入了超过 100 个字符的输入,你可能会得到一些奇怪的输出。此外,一次写一个字符是愚蠢的。 -
你为什么
fork()ing?你为什么sleep()ing? -
read(0, buf1, 100);读取 100 个输入字符 - 它不会在'\n'处停止。它不形成字符串。研究fgets(). -
@chux-ReinstateMonica — 如果标准输入来自终端,
read()调用通常只会读取到第一个换行符(假设终端处于规范模式并且没有数据排队等待阅读;如果输入行长于 100 个字符,您当然只能得到 100 个字符(没有空字节)。如果输入不是来自终端,则您的观察是正确的。这取决于终端驱动程序。 -
是的@JonathanLeffler,从第一个字符串中删除换行符对于找到解决方案至关重要。我通过写除最后一个缓冲区之外的第一个缓冲区的所有字节来完成它。非常感谢您的帮助。