我正在阅读一本unix的书,特别是关于execve()系统调用的部分。书中说,与打开的文件相关的文件描述符被传递给子进程,并且在进程调用execve()后(默认行为)。
然而,当我尝试用这段代码读取一个打开的文件描述符时,它似乎不起作用,这个文件描述符是由execve()生成的。
调用execve()的程序:
int main(int arg,char *argv[],char**env){
int fd;
if ( (fd = open("text.txt",O_RDWR | O_CREAT, ALL_OWNER )) == -1 ){
printf("Open failed\n");
exit(1);
};
printf("%d\n",fd); // 3
char buff [] = "Hello World\n";
write(fd,buff,strlen(buff));
int res;
if ( (res = execl("./demo",(char *)0)) == -1 ){
exit(1);
};
}
由execve()调用的程序演示:
setbuf(stdout,NULL);
printf("Demo executing...\n");
ssize_t r;
char buff[1024];
while ( (r = read(3,buff,sizeof(buff))) > 0 ){
write(STDOUT_FILENO,buff,r);
}
- 我使用的是Mac OS
1条答案
按热度按时间q5lcpyga1#
“demo”进程继承文件描述符,可以读取文件,但文件偏移量在文件末尾,在调用
execl()
之前使用lseek(fd, 0, SEEK_SET)
,或者在阅读文件之前在“demo”中执行。