有人可以解释一下程序中以下两行的含义来实现管道吗?

Posted

技术标签:

【中文标题】有人可以解释一下程序中以下两行的含义来实现管道吗?【英文标题】:Can someone please explain the meaning of two lines below in the program to implement pipe? 【发布时间】:2019-06-01 10:09:27 【问题描述】:

需要解释作者在这里试图做什么。 为什么我不能使用一维数组而不是二维数组?

char writemessages[2][20]="Hi", "Hello";
char readmessage[20];

程序sn-p:

   int main() 
   int pipefds[2];
   int returnstatus;
   char writemessages[2][20]="Hi", "Hello"; //why can't i use singlr char array
   char readmessage[20];
   returnstatus = pipe(pipefds);

   if (returnstatus == -1) 
      printf("Unable to create pipe\n");
      return 1;
   

   printf("Writing to pipe - Message 1 is %s\n", writemessages[0]);
   write(pipefds[1], writemessages[0], sizeof(writemessages[0]));
   read(pipefds[0], readmessage, sizeof(readmessage));
   printf("Reading from pipe – Message 1 is %s\n", readmessage);
   printf("Writing to pipe - Message 2 is %s\n", writemessages[0]);
   write(pipefds[1], writemessages[1], sizeof(writemessages[0]));
   read(pipefds[0], readmessage, sizeof(readmessage));
   printf("Reading from pipe – Message 2 is %s\n", readmessage);
   return 0;

【问题讨论】:

可能是因为他们想分别发送两条消息?不看整个代码就很难说... 有一个问题:“你”发送writemessages[0]writemessages[1] 但始终指定sizeof(writemessages[0]) @A如果没有问题,sizeof(writemessages[0])sizeof(writemessages[1])都等于20,你可能会混淆sizeofstrlen @bruno:没错!虽然从“审阅者”的角度来看,它看起来像一个错误。 【参考方案1】:

解释下面两行的含义

线

char writemessages[2][20]="Hi", "Hello";

定义一个包含 2 行 20 列的字符数组并对其进行初始化,因为空字符结束字符串,该数组可以包含 2 个字符串,最多 19 个字符,不包括空字符。

初始化使第一个字符串为'H''i'然后是空字符,第二个'H''e''l''l''o'然后是空字符

这是相当于:

char writemessages[2][20]=  'H', 'i', 0 ,  'H', 'e', 'l', 'l', 'o', 0 ;

char writemessages[2][20]= 
    'H', 'i', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,
    'H', 'e', 'l', 'l', 'o', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 
;

线

char readmessage[20];

定义一个大小为 20 的数组,因此最多允许空字符多出 19 个字符。

为什么我不能使用一维数组而不是二维数组?

这只是将它们分组为二维数组的一种选择,您也可以使用一维数组:

 char writemessage1[20] = "Hi";
 char writemessage1[20] = "Hello";

 printf("Writing to pipe - Message 1 is %s\n", writemessage1);
 write(pipefds[1], writemessage1, sizeof(writemessage1));
 ...
 printf("Writing to pipe - Message 2 is %s\n", writemessage2);
 write(pipefds[1], writemessage2, sizeof(writemessage2));

注意代码总是发送 20 个字符,将定义更改为有

 char writemessage1[] = "Hi";
 char writemessage1[] = "Hello";

write(pipefds[1], writemessage1, sizeof(writemessage1)); 发送 3 个字符,write(pipefds[1], writemessage2, sizeof(writemessage2)); 发送 6 个字符,因为数组的大小(它们会自动调整大小并初始化为包含结尾的空字符)


大概

printf("Writing to pipe - Message 2 is %s\n", writemessages[0]);
write(pipefds[1], writemessages[1], sizeof(writemessages[0]));

必须

printf("Writing to pipe - Message 2 is %s\n", writemessages[1]);
write(pipefds[1], writemessages[1], sizeof(writemessages[1]));

发送“Hello”而不是再次发送“Hi”

【讨论】:

以上是关于有人可以解释一下程序中以下两行的含义来实现管道吗?的主要内容,如果未能解决你的问题,请参考以下文章

有人可以解释一下 C 中 signal() 语法的含义吗? [复制]

MATLAB - 有人可以解释一下这些代码行的作用吗

有人可以解释 Ruby 在块中使用管道字符吗?

有人可以解释一下这里发生了啥吗?存在普遍量化

C ++中括号的不同含义?

有人可以解释管道缓冲区死锁吗?