在學習進程通信是遇到個疑惑:
學習Linux編程前,一直認爲在C中字符數組和字符指針是一回事,而今天遇到的問題說明兩者並不相同。
學習進程通信階段,包括管道通信,信號通信,共享內存。在編寫共享內存測試程序時有這樣一段:
strncpy(p_addr,argv[1],1024);
strncpy的三個參數,分別是目標地址這裏是上面定義的指針char *p_addr,複製地址這裏是通過主函數參數傳遞過來的的字符串指針,第三個是需要複製的字節數量。
還有c_addr=shmat(shmid,0,0);
printf("Client get %p\n",c_addr);
printf直接打印指針變量c_addr指向的字符串。
注意:這裏p_addr和c_addrd都是通過char *p_addr,*c_addr; 定義的兩個指針。
這說明在主函數內部定義的指針可以進行賦值和取值。
而轉過頭來把之前管道通信的程序如下:
void main()
{
int num;
char readbuf[11];
int pipefd[2];
if(pipe(pipefd) == -1)
{
printf("pipe flase");
}
if(fork()) //父進程寫管道
{
close(pipefd[0]);
num = write(pipefd[1],"hello world", 11);
printf("write num is %d\n",num);
wait();
exit(0);
}
else //子進程讀管道
{
close(pipefd[1]);
sleep(1);
num = read(pipefd[0],readbuf,11);
printf("read num is %d\n",num);
printf("readbuf is %s\n",readbuf);
exit(0);
}
這裏定義的readbuf是字符數組而不是指針,將其改爲指針後則輸出亂碼,其read返回-1(說明,讀取失敗)
更有趣的是我這裏在write和read都做了返回值的打印。不接受返回值時,就算是數組也會出錯。不清楚。。。
爲了驗證是該類函數和數組的鍋,而不是因爲該讀寫文件的屬性造成操作失敗(這裏操作的是無名管道通信文件)。
又寫了一個簡單的文件讀寫程序如下:
void main()
{
int id,num;
char readbuf[6];
char *writebuf = "56afd4";
id = open("/home/uptech/test/testop/a",O_CREAT|O_RDWR, 0777);
if(id == -1)
{
printf("open flase");
}
num = write(id,writebuf,strlen(writebuf));
lseek(id,0,SEEK_SET);
printf("write num is %d\n",num);
if(num == -1)
{
printf("write flase");
}
num = read(id,readbuf,6);
printf("read num is %d\n",num);
if(num == -1)
{
printf("read flase");
}
printf("readbuf is %s\n",readbuf);
}
這是可以運行的正確程序,同樣一開始讀寫緩衝區都是定義的指針,運行錯誤。
最後改成現在的寫緩衝是指針,讀緩衝是字符數組。可以正常下運行。
難道兩個進程通過管道通信必須事先約定好數據傳輸的大小,而不是不說定義成數組讓通信更加簡單。(向共享內存一樣)
這裏提出一個疑問:指針定義是如果對其賦值,當然指針指向靜態數據區,該地址儲存初值。如果不對它進行賦值指針又會指向哪裏?如果還是指向靜態區,好像就可以說明上面的問題了。待解決????