LINUX文件類系統調用的幾個問題

在學習進程通信是遇到個疑惑:

學習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);
}

這是可以運行的正確程序,同樣一開始讀寫緩衝區都是定義的指針,運行錯誤。

最後改成現在的寫緩衝是指針,讀緩衝是字符數組。可以正常下運行。

難道兩個進程通過管道通信必須事先約定好數據傳輸的大小,而不是不說定義成數組讓通信更加簡單。(向共享內存一樣)

這裏提出一個疑問:指針定義是如果對其賦值,當然指針指向靜態數據區,該地址儲存初值。如果不對它進行賦值指針又會指向哪裏?如果還是指向靜態區,好像就可以說明上面的問題了。待解決????

(使用字符數組作爲讀寫緩衝不會出錯)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章