我在“TIMM_OSAL_WriteToFrontOfPipe”和“TIMM_OSAL_WriteToPipe”中遇到了链接
在TIMM_OSAL_WriteToPipe中,数据只是为了编写管道的末端。在TIMM_OSAL_WriteToFrontOfPipe中,在写入端写入数据,然后再读又写。
我试着用下面的示例程序复制相同的内容。但又不明白读写的意义。有人能给它加点光吗?
int main(void)
{
int fd[2];
int status = pipe (fd);
if (status) {
fprintf(stderr, "** pipe create failed");
return 0;
}
status = fork();
if (status < 0)
fprintf (stderr, "** fork failure!");
if (status == 0){
//close (fd[1]);
char buf[5] = {0,};
int ret_size;
fprintf(stderr, "child going to sleep...\n");
sleep (10);
fprintf(stderr, "\nchild woken up...\n");
ret_size = read (fd[0], buf, 5);
fprintf (stderr, "child printing ...\n");
fprintf (stderr, "%s\n", buf);
} else {
char buf[5] = {0};
int read_sz;
int write_sz;
//close (fd[0]);
strcpy(buf,"1");
write_sz = write (fd[1], buf, 1);
strcpy(buf,"2");
write_sz = write (fd[1], buf, 1);
strcpy(buf,"3");
write_sz = write (fd[1], buf, 1);
strcpy(buf,"4");
write_sz = write (fd[1], buf, 1);
if (write_sz < 0)
fprintf (stderr, "write failed");
else
fprintf(stderr, "written 1234\n");
memset(buf, 0, sizeof(buf));
strcpy(buf,"5");
write(fd[1], buf, 1);
memset(buf, 0, sizeof(buf));
read_sz = read (fd[0], buf, 5);
if (read_sz > 0)
fprintf(stderr, "read data :\n%s\n", buf);
//write back to pipe
write (fd[1], buf, 5);
}
return 0;
}输出:
written 1234
read data :
12345
child going to sleep...
child woken up...
child printing ...
12345我也尝试过不使用fork,在相同的过程中读和写。
发布于 2016-07-31 07:50:44
WriteToFrontOfPipe的意思是:
|----------------CURRENT_DATA| -> |------CURRENT_DATA YOUR_DATA|
因为管道的作用类似于队列,所以需要三个操作:
|------YOUR_DATA CURRENT_DATA| //写入数据
|-------------------YOUR_DATA| //读取尾将数据放在前面
|------CURRENT_DATA YOUR_DATA| //保存以前的数据
https://stackoverflow.com/questions/38681577
复制相似问题