Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.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 使用管道时出现意外输出_C_Linux_Pipe - Fatal编程技术网

C 使用管道时出现意外输出

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

我是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 == -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。请注意,在这里说“谢谢”的首选方式是投票选出好的问题和有用的答案(一旦你有足够的声誉这么做),并接受对你提出的任何问题最有用的答案(这也会给你的声誉带来一点提升)。请参阅本页,以及