首页
登录 | 注册

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

这是可以运行的正确程序,同样一开始读写缓冲区都是定义的指针,运行错误。

最后改成现在的写缓冲是指针,读缓冲是字符数组。可以正常下运行。

难道两个进程通过管道通信必须事先约定好数据传输的大小,而不是不说定义成数组让通信更加简单。(向共享内存一样)

这里提出一个疑问:指针定义是如果对其赋值,当然指针指向静态数据区,该地址储存初值。如果不对它进行赋值指针又会指向哪里?如果还是指向静态区,好像就可以说明上面的问题了。待解决????

(使用字符数组作为读写缓冲不会出错)



2020 jeepxie.net webmaster#jeepxie.net
10 q. 0.009 s.
京ICP备10005923号