ここでは、パイプを使用して単純なクライアントとサーバーを作成しようとしています。子をクライアントとして機能させ、親をサーバーとして機能させるプロセスをフォークします。以下はコードです:
#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);
}
質問1:
これが起こっていることです。プログラムを実行すると、Anything that yo
(正確に16文字)しか出力されず、他には何も出力されません。コメントに示されているループのtxt1
使用の完全な内容を確認しようとすると、の後にnull値(神はどこから知っているか)があることがわかりました。その後は本来の内容になります。なぜこれが起こっているのか考えていますか?for
yo
txt1
編集:
適切な場所に印刷しようとすると、読み書きされたバイト数はすべて正しいです。印刷し256 bytes read
ます。ただし、txt1
bystrlenのサイズは「16」になります。また、文字列の一部を印刷した後、プログラムがハングします。
質問2:
scanf
を使用して、またはコメントに表示されているユーザーから文字列を取得しようとすると、fgets
Enterキーを押すとすぐにプログラムが終了します。なぜそれが起こっているのかについても、それについての手がかりはありません。
行動に関する洞察は役に立ちます。複数の質問でごめんなさい。御時間ありがとうございます。!私はubuntu12.04を使用しています。