unix 文件描述符未正确传递到使用execve()系统调用生成的进程

jucafojl  于 2022-11-04  发布在  Unix
关注(0)|答案(1)|浏览(144)

我正在阅读一本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
q5lcpyga

q5lcpyga1#

“demo”进程继承文件描述符,可以读取文件,但文件偏移量在文件末尾,在调用execl()之前使用lseek(fd, 0, SEEK_SET),或者在阅读文件之前在“demo”中执行。

相关问题