我在使用管道时候,有一段是关于一个进程在创建子进程后,子进程execl另一个已编写的pipe4,pipe4中read设备文件符file_descriptors[0]以获取数据,我在想关于'\n'是否会被识别到pipe4中(实际上能传入就能识别)。于是就想做个从标准端口输入,并写入文件test.txt中,再读出的实验。
len1.c如下:
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
int main()
{ int file;
int res;
char list[1024];
memset(list,'\0',sizeof(list));
file = open("test.txt",O_RDWR|O_CREAT,S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH);
res = read(0,list,1024);
printf("input %d characters\n",res);
res = write(file,list,res);
printf("write %d characters into test.txt .\n",res);
res = read(file,list,1024);
printf("read %d characters from test.txt \n%s\n", res ,list);
exit(EXIT_SUCCESS);
}
结果:
I love you
input 11 characters
write 11 characters into test.txt .
read 0 characters from test.txt
I love you
最后res变成了0,说明最后读了test.txt,但是读出0个字符。list值没有变,大概是应为没有读出,维持原值。
(后来我在read操作前加入了:sprintf(list,"I like this game");。最后一行也变成了I like this game)
我改变源代码,len2.c:
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
int main()
{
int file;
int res;
char list[1024];
memset(list,'\0',sizeof(list));
file = open("test.txt",O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH);
res = read(0,list,1024);
printf("input %d characters\n",res);
res = write(file,list,res);
printf("write %d characters into test.txt .\n",res);
close(file);
file = open("test.txt",O_RDONLY);
res = read(file,list,1024);
printf("read %d characters from test.txt \n%s\n", res ,list);
exit(EXIT_SUCCESS);
}
结果如下:
I love you
input 11 characters
write 11 characters into test.txt .
read 11 characters from test.txt
I love you
结果正常,我想open的读写模式是否是只能先读后写(做实验成功,可行),而不能先写后读?又或者在open的O_RDWR后面还要与上一些其他的标示符?