C 使用管道时出现意外输出
我是C语言管道的新手。 我试图从一个子进程在管道上写“hello”,并从父进程读取相同的内容,但我得到了意外的输出 我使用这段代码:C 使用管道时出现意外输出,c,linux,pipe,C,Linux,Pipe,我是C语言管道的新手。 我试图从一个子进程在管道上写“hello”,并从父进程读取相同的内容,但我得到了意外的输出 我使用这段代码: #include<stdio.h> #include<unistd.h> #include<unistd.h> #include<stdlib.h> int main() { pid_t pid; int fds[2]; int ret; char ch[20]; ret = pipe(fds); if(ret
#include<stdio.h>
#include<unistd.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
pid_t pid;
int fds[2];
int ret;
char ch[20];
ret = pipe(fds);
if(ret == -1)
{
perror("pipe failed");
exit(0);
}
pid = fork();
if (pid == 0)
{
printf("Child process\n");
write(fds[1],"Hello",5);
}
if (pid > 0)
{
printf("Parent Process\n");
read(fds[0],ch,15);
printf("%s\n",ch);
}
return 0;
}
我不明白为什么这个额外的“q”会来
您试图写入6个字节,但正在将大小设置为5。您还需要在Hello结束时发送
'\0'
把你的电话改成
write(fds[1],"Hello",6);
您应该没事。您试图写入6个字节,但将大小设置为5。您还需要在Hello结束时发送
'\0'
把你的电话改成
write(fds[1],"Hello",6);
您应该很好。在将数据写入缓冲区之前,在代码中使用memset()。像
memset(ch,'\0',20);
完整的代码可能对您有所帮助
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
pid_t pid;
int fds[2];
int ret;
char ch[20];
memset(ch,'\0',20);
ret = pipe(fds);
if(ret == -1)
{
perror("pipe failed");
exit(0);
}
pid = fork();
if (pid == 0)
{
printf("Child process\n");
write(fds[1],"Hello",5);
}
if (pid > 0)
{
printf("Parent Process\n");
read(fds[0],ch,15);
printf("%s\n",ch);
}
}
#包括
#包括
#包括
#包括
#包括
int main()
{
pid_t pid;
int-fds[2];
int ret;
char-ch[20];
memset(ch,'\0',20);
ret=管道(fds);
如果(ret==-1)
{
perror(“管道故障”);
出口(0);
}
pid=fork();
如果(pid==0)
{
printf(“子进程”);
写(fds[1],“你好”,5);
}
如果(pid>0)
{
printf(“父进程”);
读取(fds[0],第15章);
printf(“%s\n”,ch);
}
}
在将数据写入缓冲区之前,在代码中使用memset()
函数,缓冲区用一个常量字节填充内存。像
memset(ch,'\0',20);
完整的代码可能对您有所帮助
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
pid_t pid;
int fds[2];
int ret;
char ch[20];
memset(ch,'\0',20);
ret = pipe(fds);
if(ret == -1)
{
perror("pipe failed");
exit(0);
}
pid = fork();
if (pid == 0)
{
printf("Child process\n");
write(fds[1],"Hello",5);
}
if (pid > 0)
{
printf("Parent Process\n");
read(fds[0],ch,15);
printf("%s\n",ch);
}
}
#包括
#包括
#包括
#包括
#包括
int main()
{
pid_t pid;
int-fds[2];
int ret;
char-ch[20];
memset(ch,'\0',20);
ret=管道(fds);
如果(ret==-1)
{
perror(“管道故障”);
出口(0);
}
pid=fork();
如果(pid==0)
{
printf(“子进程”);
写(fds[1],“你好”,5);
}
如果(pid>0)
{
printf(“父进程”);
读取(fds[0],第15章);
printf(“%s\n”,ch);
}
}
由于不记录从管道中读取的字节数,因此代码正在打印ch
变量中已经存在的垃圾。有很多方法可以解决这个问题。这段代码显示了其中的两个。我使用memset()
来确保ch
包含一些数据(并且赋值确保以null结尾)
这是管道程序输出的结果。在终端上,我通常会看到:
Parent Process
Child process
[HelloXXXXXXXXXXXXXX]
[Hello]
[Hello]
两个输出都有效。请注意,第一次打印数据时,由于没有从管道中读取空字节,所以还包括许多X
另一种方法是让子级将以null结尾的字符串的null写入管道:write(fds[1],“Hello”,sizeof(“Hello”)代码>。其他选项包括在管道上写入字符串的长度,后跟数据,然后读取长度和大量数据字节。这是(类型、长度、值)编码系统上的一个次要变量-类型没有明确指定,因为它假定为char
,因为您没有记录从管道中读取的字节数,所以您的代码正在打印ch
变量中已经存在的垃圾。有很多方法可以解决这个问题。这段代码显示了其中的两个。我使用memset()
来确保ch
包含一些数据(并且赋值确保以null结尾)
这是管道程序输出的结果。在终端上,我通常会看到:
Parent Process
Child process
[HelloXXXXXXXXXXXXXX]
[Hello]
[Hello]
两个输出都有效。请注意,第一次打印数据时,由于没有从管道中读取空字节,所以还包括许多X
另一种方法是让子级将以null结尾的字符串的null写入管道:write(fds[1],“Hello”,sizeof(“Hello”)代码>。其他选项包括在管道上写入字符串的长度,后跟数据,然后读取长度和大量数据字节。这是(类型、长度、值)编码系统上的一个次要变量-未明确指定类型,因为它假定为char
欢迎使用堆栈溢出。请注意,在这里说“谢谢”的首选方式是投票选出好的问题和有用的答案(一旦你有足够的声誉这么做),并接受对你提出的任何问题最有用的答案(这也会给你的声誉带来一点提升)。请参阅页面,也欢迎使用Stack Overflow。请注意,在这里说“谢谢”的首选方式是投票选出好的问题和有用的答案(一旦你有足够的声誉这么做),并接受对你提出的任何问题最有用的答案(这也会给你的声誉带来一点提升)。请参阅本页,以及