linux中的clone flags
时间: 2024-05-14 16:08:01 浏览: 114
可以通过系统调用 clone() 来创建一个新的进程,clone() 函数提供了一些标志(flags)来控制新进程的创建方式和行为。常见的标志包括 CLONE_NEWPID、CLONE_NEWUTS、CLONE_NEWNS、CLONE_NEWIPC、CLONE_NEWUSER 等等。这些标志可以用来实现进程间的隔离和共享。
相关问题
linux中clone的参数
在 Linux 中,`clone` 函数是用于创建一个新的进程或线程的系统调用。它的原型如下:
```c
int clone(int (*fn)(void *), void *child_stack, int flags, void *arg, .../* pid_t *ptid, void *newtls, pid_t *ctid */);
```
其中,参数的含义如下:
- `fn`:新进程或线程要执行的函数。该函数的参数是 `arg`。
- `child_stack`:新进程或线程的栈空间。它是一个指针,指向新进程或线程的栈顶。如果该参数为 `NULL`,则新进程或线程将共享父进程或线程的栈空间。
- `flags`:创建新进程或线程的标志位。可以使用以下值的按位或来组合多个标志位:
- `CLONE_VM`:共享内存空间。
- `CLONE_FILES`:共享文件描述符表。
- `CLONE_FS`:共享文件系统信息。
- `CLONE_SIGHAND`:共享信号处理器。
- `CLONE_THREAD`:创建线程。
- `CLONE_NEWNS`:创建新的挂载命名空间。
- `CLONE_NEWUTS`:创建新的 UTS 命名空间。
- `CLONE_NEWIPC`:创建新的 IPC 命名空间。
- `CLONE_NEWUSER`:创建新的用户命名空间。
- `CLONE_NEWPID`:创建新的 PID 命名空间。
- `CLONE_NEWNET`:创建新的网络命名空间。
- `arg`:传递给新进程或线程的参数。
- `ptid`:指向 PID 变量的指针,在新进程或线程创建成功后,该变量会被设置为新进程或线程的 PID。
- `newtls`:新进程或线程的 TLS(Thread-Local Storage,线程本地存储)。
- `ctid`:指向 PID 变量的指针,在新进程或线程创建成功后,该变量会被设置为新进程或线程的 PID。
其中,`flags` 参数中的命名空间标志需要特殊说明:
- `CLONE_NEWNS`:该标志创建一个新的挂载命名空间。在该命名空间中,新进程或线程会看到一个全新的文件系统层次结构,与父进程或线程完全隔离。
- `CLONE_NEWUTS`:该标志创建一个新的 UTS 命名空间。在该命名空间中,新进程或线程会看到一个全新的主机名和域名,与父进程或线程不同。
- `CLONE_NEWIPC`:该标志创建一个新的 IPC 命名空间。在该命名空间中,新进程或线程会看到一个全新的 System V IPC 和 POSIX 消息队列,与父进程或线程不同。
- `CLONE_NEWUSER`:该标志创建一个新的用户命名空间。在该命名空间中,新进程或线程会看到一个全新的用户和组 ID,与父进程或线程不同。
- `CLONE_NEWPID`:该标志创建一个新的 PID 命名空间。在该命名空间中,新进程或线程会看到一个全新的 PID 空间,与父进程或线程不同。
- `CLONE_NEWNET`:该标志创建一个新的网络命名空间。在该命名空间中,新进程或线程会看到一个全新的网络设备、IP 地址、路由表和 iptables 规则,与父进程或线程不同。
linux的clone系统调用
Linux的`clone()`系统调用是用于创建一个新的进程或线程的,其原型定义如下:
```c
int clone(int (*fn)(void *), void *child_stack, int flags, void *arg, ...
/* pid_t *ptid, void *newtls, pid_t *ctid */ );
```
其中,`fn`参数是一个函数指针,指向新进程或线程要执行的函数;`child_stack`参数是新进程或线程使用的栈空间;`flags`参数是一个标志位,用于指定新进程或线程的属性;`arg`参数是传递给新进程或线程的参数;`ptid`参数返回新线程的线程ID;`newtls`参数指向新线程的TLS(Thread Local Storage)指针;`ctid`参数返回新进程的进程ID。
`clone()`系统调用的标志位参数`flags`可以指定以下常量:
- `CLONE_VM`:共享虚拟内存空间;
- `CLONE_FS`:共享文件系统信息;
- `CLONE_FILES`:共享文件描述符表;
- `CLONE_SIGHAND`:共享信号处理函数;
- `CLONE_PTRACE`:允许被跟踪;
- `CLONE_VFORK`:创建一个子进程,但是子进程与父进程共享内存空间;
- `CLONE_NEWPID`:创建一个新的PID命名空间;
- `CLONE_NEWUTS`:创建一个新的UTS命名空间;
- `CLONE_NEWNS`:创建一个新的Mount命名空间;
- `CLONE_NEWIPC`:创建一个新的IPC命名空间;
- `CLONE_NEWNET`:创建一个新的网络命名空间;
- `CLONE_NEWUSER`:创建一个新的用户命名空间。
`clone()`系统调用的返回值为:
- 在父进程中,返回新进程或线程的进程ID或线程ID;
- 在子进程或线程中,返回0;
- 出错时,返回-1,并设置errno变量。
需要注意的是,`clone()`系统调用是非常底层的系统调用,通常情况下我们不会直接使用它来创建新的进程或线程,而是使用更高层次的API,如`fork()`、`pthread_create()`等。
阅读全文