在这里,我正在尝试使用管道创建一个简单的客户端和服务器。我分叉了一个过程,使孩子充当客户端,父母充当服务器。下面是代码:
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
void errorMsg(char* msg)
{
printf("\n%s\n", msg);
// exit(0);
}
int main()
{
int servfd[2];
int clntfd[2];
int chldpid;
if(pipe(servfd) < 0)
errorMsg("Unable to create server pipe.!!");
if(pipe(clntfd) < 0)
errorMsg("Unable to create client pipe.!!!");
if((chldpid = fork()) == 0)
{
char* txt = (char*) calloc(256, sizeof(char));
close(servfd[1]);
close(clntfd[0]);
printf("@Client: Enter a string: ");
//scanf("%s", txt); //or fgets
printf("Entered.!!");
int n;
txt = "Anything that you want will not be considered no matter what you do!!";
char txt1[256];
write(clntfd[1], txt, 256);
//if(txt1[strlen(txt1) - 1] = '\n')
//{ printf("asdasdas");
//txt[strlen(txt) - 1] = '\0';}
//int i = 0;
//for(i = 0; i < 256; i++)
//printf("%c", txt1[i]);
while((n = read(servfd[0], txt1, 256)) > 0)
printf("\nAt client: %d bytes read\n\tString: %s\n", n, txt1);
}
else
{
//printf("Parent: \n\n");
close(servfd[0]);
close(clntfd[1]);
char* txt = NULL;
int n, n1;
n = read(clntfd[0], &txt, 256);
printf("Server read: %d", n);
n1 = write(servfd[1], &txt, 256);
printf("Server write: %d", n1);
wait(chldpid);
}
exit(0);
}
问题一:
这就是正在发生的事情。当我运行程序时,它只打印Anything that yo
(正好 16 个字符),没有别的。当我试图查看注释中显示的txt1
使用循环的完整内容时,我发现infor
之后有空值(天知道从哪里来)。在它之后有正常的内容,它们应该是。知道为什么会这样吗?yo
txt1
编辑:
当我尝试在适当的位置打印它们时,读取和写入的字节数都是正确的。它打印256 bytes read
。但是,txt1
strlen 的大小是 '16'。此外,程序在打印部分字符串后挂起。
问题2:
当我尝试从用户那里获取字符串时,scanf
或者fgets
在评论中显示时,程序会在我按下回车后立即终止。也不知道为什么会发生这种情况。
对行为的任何见解都会有所帮助。很抱歉有多个问题。谢谢你的时间。!我正在使用 ubuntu 12.04,如果有帮助的话。