cloneの疑問を15分程度で追ってみる(いい加減)

仕事や諸事情で体調があまりよくなく文書が更新できていない...。

勉強会で話題になった件。
clone()システムコールのflagのうち、CLONE_PARENTって何に使うのだろう?
用途がまったく思い浮かばない.....。謎だ.....。

とあるML上でも質問が放られたが、誰も回答していない。う〜ん、ますます気になる。
とりあえず疑問はとっておこう。

あと、個人的な疑問。CLONE_FSの「filesystem information」って何だ?
grepしてみると、fork.cの以下の関数で処理わけに使っている。

static int copy_fs(unsigned long clone_flags, struct task_struct *tsk)
{
  struct fs_struct *fs = current->fs;
  if (clone_flags & CLONE_FS) {
    /* tsk->fs is already what we want */
    write_lock(&fs->lock);
    if (fs->in_exec) {
      write_unlock(&fs->lock);
      return -EAGAIN;
    }
    fs->users++;
    write_unlock(&fs->lock);
    return 0;
  }
  tsk->fs = copy_fs_struct(fs);
  if (!tsk->fs)
    return -ENOMEM;
  return 0;
}

どうもtask_structの中のfs_struct構造体がポイントみたい。
include/linux/fs_struct.h内で以下の様に定義されている。見たところ、プロセスのルートディレクトリとカレントディレクトリ、それとパーミッションを決める際のumaskを管理している様だ。
「filesystem information」って、これだけ?何か拍子抜け。

struct fs_struct {
  int users;
  rwlock_t lock;
  int umask;
  int in_exec;
  struct path root, pwd;
};