在子进程中关闭坏文件描述符

时间:2015-12-01 06:34:58

标签: c

以下是我的代码部分。我收到了错误

  

错误的文件描述符

我的代码出了什么问题?为什么我的孩子可以关闭文件?

int raceme(void* v)
{
    finish = 1;
    sleep(4);

    if ( close(fd3)!=0 )
        perror("close");
    if ( msync(lib_addr+PAGE_SIZE, PAGE_SIZE, MS_SYNC)<0 )
        perror("msync");

return 0;
}

int main()
{
    lib_addr = base;
    int sz;

    finish=0;

    sz = sizeof(cstack) / sizeof(cstack[0]);
    cpid = clone(&raceme, (void*) &cstack[sz-16], CLONE_VM|CLONE_SIGHAND|CLONE_FS|SIGCHLD, NULL );

//  synchronize threads
    while(!finish);
    fd3 = open(EATFILE, O_CREAT|O_RDWR|O_TRUNC, 0777);
    ftruncate(fd3, PAGE_SIZE);
//  try to hit the kmalloc race
    mmap(lib_addr+PAGE_SIZE, PAGE_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_FIXED, fd3, 0);
    sleep(10);
    return 0;

}

2 个答案:

答案 0 :(得分:0)

clone()创建新进程,无法再访问其父数据(除非您创建共享内存)。因此,子项无法看到您打开的文件描述符(fd3 = open()),因此子进程中fd3的值仍然无效,从而导致错误。

答案 1 :(得分:0)

来自clone man page

的参考资料
  

如果设置了CLONE_FILES,则调用进程和子进程共享相同的文件描述符表。由调用进程或子进程创建的任何文件描述符在其他进程中也是有效的。同样,如果其中一个进程关闭了文件描述符,或者更改了其关联的标志(使用fcntl(2)F_SETFD操作),则另一个进程也会受到影响。

另一方面,

  

如果未设置CLONE_FILES,子进程将继承所有的副本   在clone()时在调用进程中打开的文件描述符。   (子节点中的重复文件描述符引用相同的打开   文件描述(参见open(2))作为相应的文件描述符   在调用过程中。)打开或关闭文件的后续操作   描述符,或更改文件描述符标志,由   调用进程或子进程不会影响其他进程。