Man page - clone3(2)
Packages contains this manual
- __malloc_initialize_hook(3)
- getpwuid(3)
- frexpl(3)
- fchown(2)
- setttyent(3)
- pthread_attr_setstacksize(3)
- calloc(3)
- clog(3)
- seteuid(2)
- res_nquerydomain(3)
- y0l(3)
- catanl(3)
- catanh(3)
- inet_addr(3)
- getcwd(2)
- epoll_create1(2)
- atol(3)
- pciconfig_write(2)
- htonl(3)
- timer_settime(2)
- munmap(2)
- cexpl(3)
- rt_sigsuspend(2)
- msgctl(2)
- tan(3)
- get_mempolicy(2)
- roundf(3)
- towctrans(3)
- xdr_opaque(3)
- psignal(3)
- error_at_line(3)
- xdrmem_create(3)
- select(2)
- getdate_r(3)
- getprotobyname_r(3)
- nrand48_r(3)
- inet_netof(3)
- inet_ntoa(3)
- nextafterl(3)
- innetgr(3)
- on_exit(3)
- expm1l(3)
- strfmon(3)
- strdup(3)
- getservbyport(3)
- arch_prctl(2)
- j0(3)
- wait4(2)
- personality(2)
- bpf(2)
- pvalloc(3)
- getresuid32(2)
- des_setparity(3)
- prctl(2)
- clog10(3)
- aio_init(3)
- pthread_getconcurrency(3)
- csinl(3)
- linkat(2)
- vsscanf(3)
- isascii(3)
- xdr_union(3)
- nan(3)
- utimensat(2)
- ioctl_vt(2)
- _newselect(2)
- ldexpl(3)
- fabsf(3)
- chown(2)
- mkstemps(3)
- pthread_attr_getstacksize(3)
- listxattr(2)
- getpgrp(2)
- xdr_short(3)
- tcflush(3)
- pthread_cond_wait(3)
- argz_add(3)
- wcpncpy(3)
- reallocarray(3)
- llrintf(3)
- outsl(2)
- qsort(3)
- authnone_create(3)
- tzname(3)
- setresuid32(2)
- isspace(3)
- open_by_handle_at(2)
- drem(3)
- conjf(3)
- nanosleep(2)
- pthread_kill(3)
- putc(3)
- pthread_condattr_destroy(3)
- getpwuid_r(3)
- strverscmp(3)
- res_init(3)
- cacosl(3)
- qecvt_r(3)
- iswgraph(3)
- gethostbyname(3)
- ntohl(3)
- acct(2)
- asinl(3)
- envz_merge(3)
- strdupa(3)
- idle(2)
- getopt_long_only(3)
- hstrerror(3)
- fanotify_init(2)
- fputs_unlocked(3)
- sleep(3)
- vfprintf(3)
- scalb(3)
- nanl(3)
- lchown32(2)
- getnetent_r(3)
- fcntl(2)
- inw(2)
- rintl(3)
- arc4random(3)
- getsockopt(2)
- ilogbl(3)
- clog2(3)
- encrypt(3)
- sqrtf(3)
- isspace_l(3)
- tanl(3)
- cfmakeraw(3)
- assert(3)
- strtoull(3)
- xdrstdio_create(3)
- optopt(3)
- setrlimit(2)
- lround(3)
- xdr_accepted_reply(3)
- fmin(3)
- mq_notify(3)
- svcerr_auth(3)
- sbrk(2)
- recv(2)
- mq_unlink(2)
- strxfrm(3)
- ctan(3)
- atoi(3)
- xcrypt(3)
- sgetspent(3)
- fread(3)
- isless(3)
- ceil(3)
- pthread_cond_broadcast(3)
- oldfstat(2)
- outl(2)
- times(2)
- wcslen(3)
- popen(3)
- wprintf(3)
- labs(3)
- getrpcbynumber(3)
- shmat(2)
- clock_gettime(2)
- btree(3)
- s390_sthyi(2)
- siggetmask(3)
- getgid32(2)
- puts(3)
- scalblnl(3)
- strpbrk(3)
- catanhl(3)
- vlimit(3)
- getrpcent(3)
- tgammal(3)
- strtoll(3)
- funlockfile(3)
- xdecrypt(3)
- pthread_key_delete(3)
- setgrent(3)
- wmemmove(3)
- gnu_dev_major(3)
- regexec(3)
- lrintl(3)
- __ppc_set_ppr_med(3)
- rmdir(2)
- io_getevents(2)
- request_key(2)
- ecvt(3)
- __ppc_mdoom(3)
- mktemp(3)
- key_gendes(3)
- le64toh(3)
- statvfs(3)
- rpc(3)
- getdate_err(3)
- munlockall(2)
- close(2)
- xdr_rejected_reply(3)
- dlerror(3)
- le32toh(3)
- feclearexcept(3)
- insque(3)
- clntraw_create(3)
- getutid(3)
- strtof(3)
- settimeofday(2)
- mkdir(2)
- rewind(3)
- logf(3)
- tmpnam(3)
- iswpunct(3)
- wcrtomb(3)
- epoll_pwait(2)
- getitimer(2)
- wordexp(3)
- clog2f(3)
- capset(2)
- strrchr(3)
- outsb(2)
- freeifaddrs(3)
- getwc_unlocked(3)
- ustat(2)
- bswap_16(3)
- program_invocation_short_name(3)
- ldiv(3)
- exp10f(3)
- vprintf(3)
- wcsncpy(3)
- iscntrl(3)
- readlink(2)
- semget(2)
- connect(2)
- psiginfo(3)
- epoll_ctl(2)
- removexattr(2)
- envz_strip(3)
- fgetxattr(2)
- atexit(3)
- putgrent(3)
- bswap(3)
- getegid32(2)
- qecvt(3)
- asinh(3)
- isfdtype(3)
- setenv(3)
- readdir(3)
- rtime(3)
- nearbyint(3)
- getgroups32(2)
- statx(2)
- modify_ldt(2)
- cpow(3)
- eventfd_read(3)
- sendfile64(2)
- getnetbyname(3)
- fremovexattr(2)
- uselib(2)
- inet(3)
- endutxent(3)
- clnt_spcreateerror(3)
- pututline(3)
- nexttowardl(3)
- getipnodebyaddr(3)
- fts_set(3)
- memmem(3)
- fmodl(3)
- setfsuid32(2)
- wordfree(3)
- fadvise64(2)
- getppid(2)
- qsort_r(3)
- toupper(3)
- getwc(3)
- fputws(3)
- mrand48(3)
- preadv(2)
- sincosf(3)
- fstatat64(2)
- dirfd(3)
- jnf(3)
- static_assert(3)
- wctype(3)
- vwarn(3)
- setfsent(3)
- listen(2)
- wcstok(3)
- argz_insert(3)
- select_tut(2)
- ctanl(3)
- getunwind(2)
- difftime(3)
- daylight(3)
- sigpause(3)
- wcscat(3)
- dlclose(3)
- __ppc_set_ppr_med_low(3)
- pread(2)
- fstatvfs(3)
- cbrtf(3)
- strnlen(3)
- sinhl(3)
- inl_p(2)
- setregid32(2)
- putwc(3)
- register_printf_type(3)
- nextafterf(3)
- opendir(3)
- strtod(3)
- tgamma(3)
- malloc_get_state(3)
- aio_write(3)
- timezone(3)
- xdr_pmaplist(3)
- sysfs(2)
- index(3)
- svcerr_noproc(3)
- envz(3)
- klogctl(3)
- pselect(2)
- get_current_dir_name(3)
- xdr_char(3)
- asinhf(3)
- preadv2(2)
- inotify_init1(2)
- pthread_attr_setstackaddr(3)
- getline(3)
- tanhf(3)
- rtnetlink(3)
- pkey_alloc(2)
- edata(3)
- stailq(3)
- isastream(2)
- setregid(2)
- copy_file_range(2)
- rcmd_af(3)
- futex(2)
- prof(2)
- siglongjmp(3)
- hdestroy(3)
- catan(3)
- pthread_cond_signal(3)
- mkfifoat(3)
- clntudp_create(3)
- getentropy(3)
- vsprintf(3)
- fabs(3)
- lseek64(3)
- pthread_setname_np(3)
- conjl(3)
- chroot(2)
- ccoshf(3)
- erand48_r(3)
- wcsnrtombs(3)
- rindex(3)
- fputc_unlocked(3)
- setresgid32(2)
- gettimeofday(2)
- cexp(3)
- inotify_add_watch(2)
- set_robust_list(2)
- nice(2)
- strtold(3)
- mq_getattr(3)
- xdr(3)
- getxattr(2)
- getrandom(2)
- splice(2)
- strerror(3)
- fcntl64(2)
- fnmatch(3)
- ungetwc(3)
- getspnam_r(3)
- clearenv(3)
- atan2(3)
- get_myaddress(3)
- open(2)
- pthread_setcancelstate(3)
- newlocale(3)
- open_memstream(3)
- setprotoent(3)
- logbf(3)
- ilogb(3)
- wmemcpy(3)
- tcsendbreak(3)
- be16toh(3)
- perfmonctl(2)
- strtoq(3)
- getgrgid_r(3)
- pthread_timedjoin_np(3)
- memfd_create(2)
- getttynam(3)
- mcheck_pedantic(3)
- _llseek(2)
- renameat2(2)
- ioperm(2)
- ecb_crypt(3)
- pthread_condattr_init(3)
- fminl(3)
- lio_listio(3)
- envz_add(3)
- setbuf(3)
- setkey(3)
- expm1(3)
- strtoul(3)
- getcwd(3)
- setutxent(3)
- getrpcent_r(3)
- unimplemented(2)
- fclose(3)
- epoll_create(2)
- getfsent(3)
- key_secretkey_is_set(3)
- vserver(2)
- vswprintf(3)
- sigsuspend(2)
- pututxline(3)
- clnt_freeres(3)
- cacheflush(2)
- ioprio_set(2)
- alarm(2)
- fgetc(3)
- __fpurge(3)
- getlogin_r(3)
- vfork(2)
- bstring(3)
- div(3)
- getrusage(2)
- gettid(2)
- dprintf(3)
- strtoumax(3)
- jrand48(3)
- iswcntrl(3)
- vwarnx(3)
- cacos(3)
- ccoshl(3)
- fesetexceptflag(3)
- res_nclose(3)
- shmop(2)
- mcheck_check_all(3)
- vscanf(3)
- tolower(3)
- landlock_add_rule(2)
- argz_next(3)
- lroundl(3)
- ruserok(3)
- glob(3)
- brk(2)
- rename(2)
- strcspn(3)
- sched_getscheduler(2)
- wcstoumax(3)
- dbopen(3)
- xdr_bytes(3)
- fegetenv(3)
- scalbf(3)
- pkey_free(2)
- fgetgrent(3)
- strchrnul(3)
- fork(2)
- log1pf(3)
- strtoimax(3)
- fputs(3)
- putspent(3)
- ttyname_r(3)
- iswlower(3)
- epoll_wait(2)
- minor(3)
- wcsspn(3)
- sendmmsg(2)
- pthread_attr_getsigmask_np(3)
- erand48(3)
- setpgrp(2)
- db(3)
- readv(2)
- cimagf(3)
- pthread_sigmask(3)
- getresuid(2)
- gamma(3)
- logwtmp(3)
- imaxabs(3)
- y1(3)
- swapoff(2)
- svcerr_weakauth(3)
- mbtowc(3)
- madvise(2)
- __fbufsize(3)
- swapon(2)
- towlower(3)
- asin(3)
- initgroups(3)
- svc_getreqset(3)
- pthread_attr_destroy(3)
- scalblnf(3)
- ispunct(3)
- casin(3)
- xdr_pmap(3)
- sigvec(3)
- dlmopen(3)
- localeconv(3)
- tcgetattr(3)
- mempcpy(3)
- clnt_perrno(3)
- clock_getcpuclockid(3)
- setaliasent(3)
- clock(3)
- ftok(3)
- svc_run(3)
- getsubopt(3)
- coshf(3)
- pow(3)
- getpwent(3)
- ntp_gettime(3)
- xdrrec_skiprecord(3)
- symlink(2)
- shmctl(2)
- mq_timedreceive(2)
- malloc(3)
- tgkill(2)
- l64a(3)
- unlockpt(3)
- mallopt(3)
- creal(3)
- syscalls(2)
- set_tid_address(2)
- exp2f(3)
- fstatfs(2)
- statfs(2)
- dreml(3)
- feenableexcept(3)
- ftw(3)
- fanotify_mark(2)
- clnt_sperror(3)
- realpath(3)
- sysconf(3)
- _syscall(2)
- set_mempolicy(2)
- mq_unlink(3)
- freehostent(3)
- rresvport_af(3)
- nl_langinfo_l(3)
- fmaxl(3)
- iscntrl_l(3)
- copysignf(3)
- llseek(2)
- bzero(3)
- ioctl_fsmap(2)
- remquof(3)
- malloc_trim(3)
- pthread_getattr_default_np(3)
- isalnum_l(3)
- mlock(2)
- nearbyintf(3)
- confstr(3)
- sinf(3)
- ioctl_eventpoll(2)
- sigstack(3)
- seed48_r(3)
- utmpname(3)
- malloc_stats(3)
- stpncpy(3)
- getservbyport_r(3)
- cabsl(3)
- isblank(3)
- sigprocmask(2)
- isinfl(3)
- isinff(3)
- pathconf(3)
- xdr_u_short(3)
- acos(3)
- timerfd_create(2)
- key_encryptsession(3)
- log2f(3)
- oldlstat(2)
- res_querydomain(3)
- memcmp(3)
- gethostbyaddr(3)
- sighold(3)
- gtty(2)
- xdr_void(3)
- getmsg(2)
- io_setup(2)
- ttyslot(3)
- recno(3)
- cuserid(3)
- nanf(3)
- pthread_getaffinity_np(3)
- if_indextoname(3)
- remainderf(3)
- putpwent(3)
- pow10f(3)
- pwritev(2)
- swapcontext(3)
- cfsetospeed(3)
- envz_remove(3)
- cosh(3)
- a64l(3)
- uselocale(3)
- yn(3)
- msgget(2)
- pthread_equal(3)
- prlimit(2)
- setspent(3)
- newfstatat(2)
- renameat(2)
- truncf(3)
- pthread_yield(3)
- tkill(2)
- islessequal(3)
- isnanf(3)
- sethostent(3)
- setvbuf(3)
- gnu_get_libc_release(3)
- atoll(3)
- getgrnam(3)
- get_robust_list(2)
- __ppc_yield(3)
- __memalign_hook(3)
- eventfd2(2)
- mq_setattr(3)
- tmpnam_r(3)
- pmap_getport(3)
- svcfd_create(3)
- getfsspec(3)
- setgid(2)
- getlogin(3)
- get_nprocs(3)
- canonicalize_file_name(3)
- pthread_mutexattr_getrobust(3)
- strerrorname_np(3)
- csinh(3)
- malloc_set_state(3)
- tcgetsid(3)
- ssignal(3)
- secure_getenv(3)
- significandl(3)
- wcschr(3)
- isgraph(3)
- pthread_mutexattr_gettype(3)
- creat(2)
- cabsf(3)
- __ppc_set_ppr_med_high(3)
- fchdir(2)
- backtrace_symbols(3)
- exp10l(3)
- euidaccess(3)
- sync_file_range(2)
- getutxline(3)
- isdigit(3)
- sinhf(3)
- lgetxattr(2)
- getaliasent(3)
- memrchr(3)
- io_submit(2)
- clnt_create(3)
- __setfpucw(3)
- _flushlbf(3)
- lcong48_r(3)
- clog10l(3)
- pmap_getmaps(3)
- memalign(3)
- xdr_authunix_parms(3)
- execl(3)
- getdate(3)
- cfsetispeed(3)
- tanhl(3)
- wmempcpy(3)
- outw_p(2)
- faccessat(2)
- rresvport(3)
- nextup(3)
- fgetgrent_r(3)
- getopt(3)
- xdr_vector(3)
- aio_error(3)
- frexpf(3)
- getpw(3)
- sscanf(3)
- mprotect(2)
- exp(3)
- sched_getaffinity(2)
- accept4(2)
- remainderl(3)
- pthread_key_create(3)
- endian(3)
- setmntent(3)
- get_phys_pages(3)
- argz(3)
- _exit(2)
- towupper_l(3)
- lrand48(3)
- csqrt(3)
- hdestroy_r(3)
- remquo(3)
- feof_unlocked(3)
- isprint(3)
- pivot_root(2)
- arc4random_uniform(3)
- strfroml(3)
- getdomainname(2)
- va_end(3)
- getresgid(2)
- cosf(3)
- endhostent(3)
- setgid32(2)
- ioctl_fs(2)
- getaddrinfo(3)
- fgetwc(3)
- lock(2)
- getservbyname_r(3)
- sys_nerr(3)
- insb(2)
- usleep(3)
- security(2)
- cfree(3)
- tanf(3)
- fprintf(3)
- pthread_mutexattr_setpshared(3)
- xprt_unregister(3)
- alphasort(3)
- getgrent(3)
- scandirat(3)
- iruserok(3)
- ttyname(3)
- tdestroy(3)
- strcasecmp(3)
- getpgid(2)
- drand48_r(3)
- mmap(2)
- sigtimedwait(2)
- pthread_once(3)
- mq_receive(3)
- pthread_mutexattr_setkind_np(3)
- iopl(2)
- s390_runtime_instr(2)
- lckpwdf(3)
- memmove(3)
- __fpending(3)
- mbsrtowcs(3)
- restart_syscall(2)
- memset(3)
- significandf(3)
- openat2(2)
- timeradd(3)
- conj(3)
- flockfile(3)
- madvise1(2)
- inet_aton(3)
- fstatfs64(2)
- fmax(3)
- fmemopen(3)
- fmaf(3)
- lseek(2)
- registerrpc(3)
- kexec_file_load(2)
- gammal(3)
- feof(3)
- pidfd_open(2)
- crealf(3)
- clogl(3)
- getutmp(3)
- umount(2)
- inet_pton(3)
- flistxattr(2)
- xdr_wrapstring(3)
- socketcall(2)
- setrpcent(3)
- rint(3)
- vm86(2)
- sincosl(3)
- getprotoent_r(3)
- mknod(2)
- getdents64(2)
- gai_cancel(3)
- srandom_r(3)
- getnetbyname_r(3)
- sigaddset(3)
- htole16(3)
- endnetent(3)
- nextafter(3)
- timerisset(3)
- getgrent_r(3)
- freeaddrinfo(3)
- endprotoent(3)
- mbind(2)
- sigorset(3)
- pthread_rwlockattr_setkind_np(3)
- cimag(3)
- waitid(2)
- abs(3)
- unlink(2)
- recvmsg(2)
- getaliasbyname(3)
- wctrans(3)
- kill(2)
- strtol(3)
- __ppc_set_ppr_very_low(3)
- membarrier(2)
- getnetbyaddr_r(3)
- writev(2)
- errx(3)
- tfind(3)
- clone3(2)
- __freading(3)
- outw(2)
- regfree(3)
- accept(2)
- timer_getoverrun(2)
- shmdt(2)
- svcerr_decode(3)
- getnameinfo(3)
- endusershell(3)
- execvpe(3)
- cbc_crypt(3)
- res_send(3)
- xdr_destroy(3)
- getcontext(3)
- pkey_mprotect(2)
- twalk_r(3)
- isalnum(3)
- timercmp(3)
- setxattr(2)
- pthread_cleanup_pop_restore_np(3)
- stat(2)
- isupper(3)
- vsyslog(3)
- strlen(3)
- pthread_attr_setinheritsched(3)
- xdr_inline(3)
- strtouq(3)
- raise(3)
- getpeername(2)
- capget(2)
- atanl(3)
- ferror_unlocked(3)
- isxdigit_l(3)
- modfl(3)
- pthread_mutexattr_init(3)
- pthread_mutexattr_getkind_np(3)
- phys(2)
- llabs(3)
- sched_rr_get_interval(2)
- asprintf(3)
- explicit_bzero(3)
- asctime(3)
- clone(2)
- munlock(2)
- __realloc_hook(3)
- atof(3)
- rt_tgsigqueueinfo(2)
- syslog(2)
- inet_makeaddr(3)
- epoll_pwait2(2)
- iswalpha(3)
- netlink(3)
- sched_setattr(2)
- sigdescr_np(3)
- access(2)
- getc_unlocked(3)
- dysize(3)
- inet_net_pton(3)
- sched_setparam(2)
- timerfd_settime(2)
- nexttowardf(3)
- expf(3)
- svcerr_progvers(3)
- getwchar(3)
- ftime(3)
- if_nametoindex(3)
- argz_add_sep(3)
- vasprintf(3)
- unlinkat(2)
- putenv(3)
- pthread_mutexattr_setrobust_np(3)
- error_message_count(3)
- setfsgid(2)
- cmsg(3)
- setpwent(3)
- cfgetospeed(3)
- end(3)
- pidfd_send_signal(2)
- scalbn(3)
- closelog(3)
- srandom(3)
- argz_replace(3)
- ioctl_tty(2)
- va_arg(3)
- towlower_l(3)
- isblank_l(3)
- remove(3)
- expl(3)
- fscanf(3)
- versionsort(3)
- pow10(3)
- hsearch(3)
- gethostid(3)
- fchownat(2)
- group_member(3)
- getchar_unlocked(3)
- getservbyname(3)
- pthread_mutexattr_destroy(3)
- setpgid(2)
- acosf(3)
- ctanhf(3)
- shm_open(3)
- towupper(3)
- getdents(2)
- chown32(2)
- hypotf(3)
- undocumented(3)
- drand48(3)
- csinf(3)
- ctime_r(3)
- setlinebuf(3)
- ulimit(3)
- spu_create(2)
- fcvt_r(3)
- ipc(2)
- ftruncate64(2)
- fdopen(3)
- svcerr_noprog(3)
- getrpcport(3)
- csin(3)
- sinh(3)
- nrand48(3)
- openpty(3)
- xdr_double(3)
- pthread_attr_getscope(3)
- vfscanf(3)
- catanhf(3)
- inb(2)
- wcpcpy(3)
- ldexp(3)
- getopt_long(3)
- strerrordesc_np(3)
- mbsinit(3)
- argz_stringify(3)
- setbuffer(3)
- byteorder(3)
- expm1f(3)
- pthread_attr_setscope(3)
- gnu_dev_makedev(3)
- pipe(2)
- updwtmp(3)
- fts_read(3)
- ioctl_fat(2)
- h_errno(3)
- sem_getvalue(3)
- iswupper(3)
- lrint(3)
- perror(3)
- xdr_u_int(3)
- timer_create(2)
- iswdigit(3)
- fgetspent(3)
- fwrite_unlocked(3)
- reboot(2)
- ftruncate(2)
- getutmpx(3)
- pwrite64(2)
- getauxval(3)
- xdr_pointer(3)
- getprotobynumber(3)
- svc_destroy(3)
- vmsplice(2)
- inet_network(3)
- readdir_r(3)
- setsockopt(2)
- rexec(3)
- flock(2)
- getw(3)
- mmap2(2)
- j1f(3)
- cprojf(3)
- mkstemp(3)
- symlinkat(2)
- tempnam(3)
- pthread_attr_getaffinity_np(3)
- gethostbyname_r(3)
- signalfd4(2)
- sys_siglist(3)
- erfc(3)
- truncate64(2)
- verr(3)
- pthread_kill_other_threads_np(3)
- eaccess(3)
- fsetpos(3)
- slist(3)
- pmap_unset(3)
- modf(3)
- ioctl_pipe(2)
- vfwprintf(3)
- getresgid32(2)
- statfs64(2)
- cexp2(3)
- stdio_ext(3)
- login_tty(3)
- xdr_long(3)
- dlsym(3)
- clog2l(3)
- malloc_usable_size(3)
- fegetexceptflag(3)
- basename(3)
- fwrite(3)
- vhangup(2)
- printf(3)
- setnetent(3)
- gethostbyname2(3)
- mallinfo2(3)
- signbit(3)
- clnt_broadcast(3)
- sched_yield(2)
- sem_open(3)
- sigsetjmp(3)
- cacoshl(3)
- sem_unlink(3)
- setresuid(2)
- signgam(3)
- putw(3)
- imaxdiv(3)
- regex(3)
- alloc_hugepages(2)
- modff(3)
- exp10(3)
- cprojl(3)
- utime(2)
- clogf(3)
- pthread_mutex_unlock(3)
- erff(3)
- ioctl_userfaultfd(2)
- iswprint(3)
- roundl(3)
- sqrtl(3)
- fpurge(3)
- getusershell(3)
- fcloseall(3)
- xdr_opaque_auth(3)
- gethostent_r(3)
- fgetwc_unlocked(3)
- fchmod(2)
- strptime(3)
- lutimes(3)
- htole64(3)
- putchar_unlocked(3)
- create_module(2)
- isascii_l(3)
- sigaction(2)
- stdout(3)
- geteuid32(2)
- xprt_register(3)
- freopen(3)
- ccosl(3)
- pthread_setschedprio(3)
- rt_sigaction(2)
- getmntent(3)
- putwchar_unlocked(3)
- logl(3)
- remque(3)
- unsetenv(3)
- sigwaitinfo(2)
- pthread_mutexattr_getrobust_np(3)
- initstate_r(3)
- getfsfile(3)
- exp2l(3)
- isatty(3)
- lgamma_r(3)
- lrintf(3)
- outb(2)
- __clone2(2)
- strcpy(3)
- clnt_call(3)
- hypot(3)
- fegetexcept(3)
- tcsetpgrp(3)
- gets(3)
- malloc_info(3)
- nextupf(3)
- pthread_attr_getdetachstate(3)
- getaliasent_r(3)
- fstat64(2)
- futimesat(2)
- dl_iterate_phdr(3)
- posix_madvise(3)
- endnetgrent(3)
- tolower_l(3)
- pthread_attr_setstack(3)
- pread64(2)
- sigsetops(3)
- stty(2)
- process_vm_readv(2)
- isfinite(3)
- gethostbyaddr_r(3)
- cproj(3)
- gai_strerror(3)
- key_decryptsession(3)
- inet_ntop(3)
- __ppc_mdoio(3)
- btowc(3)
- setstate_r(3)
- if_nameindex(3)
- fdetach(2)
- random_r(3)
- iruserok_af(3)
- truncl(3)
- clearerr(3)
- lgammaf(3)
- lfind(3)
- ctanf(3)
- strcat(3)
- pthread_attr_getschedpolicy(3)
- pthread_rwlockattr_getkind_np(3)
- sigrelse(3)
- daemon(3)
- pthread_setcanceltype(3)
- sigevent(7)
- iswalnum(3)
- pmap_set(3)
- stdin(3)
- ceilf(3)
- asctime_r(3)
- poll(2)
- svc_unregister(3)
- isnanl(3)
- carg(3)
- getprotobyname(3)
- arm_fadvise(2)
- optind(3)
- mount_setattr(2)
- dlvsym(3)
- ntp_adjtime(3)
- abort(3)
- pthread_getname_np(3)
- execlp(3)
- bind(2)
- bsearch(3)
- endspent(3)
- register_printf_specifier(3)
- landlock_create_ruleset(2)
- mkostemp(3)
- setgroups(2)
- toupper_l(3)
- argz_extract(3)
- sigblock(3)
- j0l(3)
- argz_delete(3)
- setusershell(3)
- getspnam(3)
- optarg(3)
- vm86old(2)
- sigandset(3)
- getdtablesize(3)
- getsockname(2)
- pthread_sigqueue(3)
- ptsname(3)
- j1(3)
- lgamma(3)
- getpagesize(2)
- pthread_mutex_lock(3)
- setsid(2)
- strncat(3)
- ioctl_kd(2)
- tsearch(3)
- mq_notify(2)
- fcvt(3)
- clntudp_bufcreate(3)
- getpwent_r(3)
- pthread_getspecific(3)
- memfrob(3)
- arc4random_buf(3)
- forkpty(3)
- powl(3)
- dlopen(3)
- stderr(3)
- set_thread_area(2)
- query_module(2)
- sem_close(3)
- strndup(3)
- __malloc_hook(3)
- setjmp(3)
- stdio(3)
- bdflush(2)
- sendto(2)
- mpx(2)
- fopen(3)
- setpriority(2)
- nextdownl(3)
- mprobe(3)
- oldstat(2)
- sem_destroy(3)
- bcopy(3)
- remap_file_pages(2)
- isgreaterequal(3)
- getpass(3)
- seekdir(3)
- break(2)
- authunix_create_default(3)
- tty_ioctl(4)
- process_madvise(2)
- endfsent(3)
- atoq(3)
- strftime(3)
- fts(3)
- getgrgid(3)
- isxdigit(3)
- ftello(3)
- regcomp(3)
- error(3)
- getenv(3)
- clnt_sperrno(3)
- readahead(2)
- y0(3)
- roundup(3)
- io_destroy(2)
- vsnprintf(3)
- lgammal(3)
- eventfd_write(3)
- pthread_mutex_trylock(3)
- lchown(2)
- dladdr(3)
- error_print_progname(3)
- pthread_mutexattr_settype(3)
- strspn(3)
- __after_morecore_hook(3)
- localtime(3)
- fsync(2)
- ether_aton(3)
- csinhl(3)
- trunc(3)
- xdr_u_char(3)
- syslog(3)
- y1f(3)
- ioctl_nsfs(2)
- wmemcmp(3)
- ffsll(3)
- ether_ntohost(3)
- bswap_32(3)
- umount2(2)
- sigfillset(3)
- landlock_restrict_self(2)
- pthread_join(3)
- sysinfo(2)
- clock_settime(2)
- llrint(3)
- s390_guarded_storage(2)
- getc(3)
- inet_lnaof(3)
- tcgetpgrp(3)
- clock_getres(2)
- etext(3)
- strfmon_l(3)
- putwc_unlocked(3)
- xdr_replymsg(3)
- scalbl(3)
- fdim(3)
- getspent(3)
- sem_timedwait(3)
- posix_fallocate(3)
- res_nmkquery(3)
- pthread_spin_unlock(3)
- mq_timedsend(2)
- opterr(3)
- getloadavg(3)
- strsignal(3)
- finite(3)
- inw_p(2)
- csinhf(3)
- execveat(2)
- seed48(3)
- sigset(3)
- setgroups32(2)
- logbl(3)
- wcsdup(3)
- clnt_geterr(3)
- sys_errlist(3)
- inotify_rm_watch(2)
- qgcvt(3)
- wcspbrk(3)
- sin(3)
- lookup_dcookie(2)
- s390_pci_mmio_read(2)
- wcscmp(3)
- getutxent(3)
- pciconfig_read(2)
- initstate(3)
- backtrace(3)
- putc_unlocked(3)
- fedisableexcept(3)
- rt_sigprocmask(2)
- clock_adjtime(2)
- fwprintf(3)
- jnl(3)
- grantpt(3)
- cimagl(3)
- getgrnam_r(3)
- remquol(3)
- swprintf(3)
- mbrtowc(3)
- fileno_unlocked(3)
- readlinkat(2)
- sigignore(3)
- strndupa(3)
- semctl(2)
- assert_perror(3)
- sendfile(2)
- shm_unlink(3)
- log(3)
- ungetc(3)
- erf(3)
- qfcvt(3)
- pthread_atfork(3)
- login(3)
- setservent(3)
- jrand48_r(3)
- wcsnlen(3)
- tcflow(3)
- pthread_cond_destroy(3)
- inl(2)
- srand48_r(3)
- erfcf(3)
- iconv(3)
- pthread_mutex_consistent_np(3)
- fabsl(3)
- pclose(3)
- nfsservctl(2)
- gai_error(3)
- wcsncmp(3)
- islower_l(3)
- iswctype(3)
- svc_register(3)
- arm_sync_file_range(2)
- strfry(3)
- strfromd(3)
- getttyent(3)
- rand(3)
- fchown32(2)
- ctime(3)
- fsetxattr(2)
- feupdateenv(3)
- random(3)
- getpwnam_r(3)
- sigwait(3)
- aio_fsync(3)
- mq_open(2)
- tanh(3)
- localtime_r(3)
- bsd_signal(3)
- strsep(3)
- mknodat(2)
- cexpf(3)
- cacosh(3)
- mbrlen(3)
- aio_cancel(3)
- mq_getsetattr(2)
- fdatasync(2)
- htons(3)
- sem_post(3)
- htobe16(3)
- vtimes(3)
- fgetpwent_r(3)
- getwchar_unlocked(3)
- mkdirat(2)
- dup(2)
- free_hugepages(2)
- feraiseexcept(3)
- lockf(3)
- userfaultfd(2)
- pthread_attr_setaffinity_np(3)
- memcpy(3)
- prlimit64(2)
- ferror(3)
- ldexpf(3)
- aio_return(3)
- adjtimex(2)
- execle(3)
- tailq(3)
- cabs(3)
- endaliasent(3)
- execvp(3)
- hasmntopt(3)
- if_freenameindex(3)
- signal(2)
- dn_comp(3)
- pthread_attr_getstack(3)
- ether_hostton(3)
- re_comp(3)
- cexp2l(3)
- getwd(3)
- llroundl(3)
- cos(3)
- pthread_mutex_consistent(3)
- isalpha_l(3)
- io_cancel(2)
- frexp(3)
- finitel(3)
- perf_event_open(2)
- pthread_exit(3)
- ioctl_console(2)
- timelocal(3)
- timersub(3)
- setresgid(2)
- semop(2)
- getgroups(2)
- envz_entry(3)
- xdr_u_long(3)
- seccomp(2)
- ftrylockfile(3)
- setuid(2)
- wcwidth(3)
- llround(3)
- cacoshf(3)
- pthread_attr_setschedpolicy(3)
- fgetpos(3)
- xdr_array(3)
- sprintf(3)
- wmemset(3)
- setcontext(3)
- copysignl(3)
- be64toh(3)
- matherr(3)
- hypotl(3)
- rawmemchr(3)
- fmodf(3)
- mount(2)
- mktime(3)
- stdarg(3)
- clnttcp_create(3)
- string(3)
- profil(3)
- clnt_perror(3)
- getpriority(2)
- regerror(3)
- clone2(2)
- getgid(2)
- pthread_spin_lock(3)
- iswblank(3)
- ftell(3)
- dup3(2)
- toascii(3)
- strncpy(3)
- mrand48_r(3)
- setstate(3)
- sigqueue(3)
- cpowf(3)
- setlogmask(3)
- sched_getcpu(3)
- htobe32(3)
- list(3)
- isdigit_l(3)
- chdir(2)
- fstat(2)
- pwritev2(2)
- get_thread_area(2)
- freelocale(3)
- acoshl(3)
- socketpair(2)
- scalbln(3)
- fpclassify(3)
- getpwnam(3)
- pthread_getcpuclockid(3)
- ioprio_get(2)
- strtok_r(3)
- exit_group(2)
- scalbnf(3)
- xdrrec_create(3)
- pthread_mutex_destroy(3)
- sqrt(3)
- dirname(3)
- exit(2)
- ulckpwdf(3)
- cargl(3)
- powerof2(3)
- simpleq(3)
- process_vm_writev(2)
- fdopendir(3)
- getpt(3)
- floorl(3)
- va_start(3)
- lcong48(3)
- strerror_l(3)
- xdrrec_eof(3)
- key_setsecret(3)
- lstat64(2)
- memfd_secret(2)
- sigreturn(2)
- casinhf(3)
- valloc(3)
- stat64(2)
- jn(3)
- sinl(3)
- pthread_testcancel(3)
- cfgetispeed(3)
- dup2(2)
- getnetent(3)
- pthread_setconcurrency(3)
- memccpy(3)
- rt_sigqueueinfo(2)
- ccosf(3)
- sincos(3)
- tcdrain(3)
- ccos(3)
- chmod(2)
- cacosf(3)
- lstat(2)
- pthread_spin_trylock(3)
- sigisemptyset(3)
- getrpcbyname(3)
- fpathconf(3)
- copysign(3)
- round(3)
- wmemchr(3)
- qfcvt_r(3)
- fattach(2)
- __fsetlocking(3)
- adjtime(3)
- makedev(3)
- des_crypt(3)
- iswspace(3)
- twalk(3)
- exec(3)
- link(2)
- fileno(3)
- endpwent(3)
- logb(3)
- wcscspn(3)
- console_ioctl(4)
- fgetpwent(3)
- setegid(2)
- clnt_destroy(3)
- getaddrinfo_a(3)
- svc_getargs(3)
- addmntent(3)
- globfree(3)
- islower(3)
- muntrace(3)
- clnt_pcreateerror(3)
- llrintl(3)
- clnt_control(3)
- fgetspent_r(3)
- strstr(3)
- putmsg(2)
- __fwritable(3)
- res_nsearch(3)
- fseeko(3)
- mq_timedreceive(3)
- log10(3)
- fexecve(3)
- gammaf(3)
- pthread_setschedparam(3)
- wcscpy(3)
- xdr_float(3)
- pthread_attr_setdetachstate(3)
- sem_wait(3)
- pow10l(3)
- re_exec(3)
- rand_r(3)
- putpmsg(2)
- getdelim(3)
- utimes(2)
- mq_close(3)
- setutent(3)
- creall(3)
- mq_send(3)
- telldir(3)
- powf(3)
- erfl(3)
- pthread_self(3)
- pselect6(2)
- unlocked_stdio(3)
- insw(2)
- cfsetspeed(3)
- argz_create(3)
- xdr_string(3)
- pthread_attr_getguardsize(3)
- finitef(3)
- setlocale(3)
- bcmp(3)
- fmtmsg(3)
- sendmsg(2)
- pthread_cleanup_push(3)
- inb_p(2)
- mmap64(3)
- getuid32(2)
- truncate(2)
- mlock2(2)
- fegetround(3)
- ugetrlimit(2)
- getprotobynumber_r(3)
- utmpxname(3)
- isinf(3)
- clearerr_unlocked(3)
- stime(2)
- nftw(3)
- duplocale(3)
- svcraw_create(3)
- svc_getcaller(3)
- ctanhl(3)
- cbrt(3)
- floorf(3)
- sethostid(3)
- sigemptyset(3)
- sigaltstack(2)
- mkfifo(3)
- lsearch(3)
- getservent_r(3)
- islessgreater(3)
- floor(3)
- argz_append(3)
- tzset(3)
- res_mkquery(3)
- fstatat(2)
- strchr(3)
- semtimedop(2)
- bindresvport(3)
- tcsetattr(3)
- warn(3)
- getservent(3)
- atanhl(3)
- tdelete(3)
- ynf(3)
- ether_ntoa_r(3)
- fesetenv(3)
- mq_timedsend(3)
- quotactl(2)
- init_module(2)
- rcmd(3)
- fenv(3)
- getutxid(3)
- pthread_mutexattr_getpshared(3)
- scalbnl(3)
- atan2l(3)
- argz_count(3)
- rpmatch(3)
- timerfd_gettime(2)
- ualarm(3)
- pthread_attr_init(3)
- vdprintf(3)
- pthread_cancel(3)
- fflush(3)
- setkey_r(3)
- mbstowcs(3)
- mremap(2)
- strcasestr(3)
- hcreate_r(3)
- siginterrupt(3)
- offsetof(3)
- atan(3)
- wctomb(3)
- getutent(3)
- significand(3)
- arm_fadvise64_64(2)
- dremf(3)
- wcswidth(3)
- syscall(2)
- rintf(3)
- bswap_64(3)
- pthread_attr_getschedparam(3)
- lroundf(3)
- timegm(3)
- posix_fadvise(2)
- getrlimit(2)
- svc_freeargs(3)
- xdr_enum(3)
- hcreate(3)
- ptrace(2)
- backtrace_symbols_fd(3)
- fetestexcept(3)
- ccosh(3)
- htole32(3)
- kexec_load(2)
- fallocate(2)
- timer_gettime(2)
- tgammaf(3)
- errno(3)
- sched_get_priority_max(2)
- xdr_getpos(3)
- vwprintf(3)
- ssetmask(2)
- ether_ntoa(3)
- waitpid(2)
- sched_getattr(2)
- inotify_init(2)
- fma(3)
- gnu_get_libc_version(3)
- svctcp_create(3)
- wcstombs(3)
- gethostname(2)
- strerror_r(3)
- sigismember(3)
- fgetws_unlocked(3)
- hash(3)
- circleq(3)
- getrpcbynumber_r(3)
- pthread_cond_timedwait(3)
- uname(2)
- fgetc_unlocked(3)
- mq_open(3)
- cosl(3)
- rewinddir(3)
- nextdown(3)
- longjmp(3)
- execv(3)
- iconv_open(3)
- xencrypt(3)
- ctermid(3)
- isgraph_l(3)
- move_pages(2)
- isunordered(3)
- msgsnd(2)
- rt_sigtimedwait(2)
- syncfs(2)
- mlockall(2)
- pthread_getschedparam(3)
- lsetxattr(2)
- getutid_r(3)
- log1pl(3)
- catanf(3)
- passwd2des(3)
- iconv_close(3)
- aligned_alloc(3)
- sched_setscheduler(2)
- gmtime(3)
- __free_hook(3)
- acoshf(3)
- mtrace(3)
- resolver(3)
- clog10f(3)
- sethostname(2)
- pthread_attr_setguardsize(3)
- tuxcall(2)
- atanh(3)
- ispunct_l(3)
- svcudp_bufcreate(3)
- ctanh(3)
- j1l(3)
- log10l(3)
- alloca(3)
- sigpending(2)
- nexttoward(3)
- isnormal(3)
- svc_getreq(3)
- putchar(3)
- getnetbyaddr(3)
- cpowl(3)
- get_kernel_syms(2)
- getutline_r(3)
- pthread_setaffinity_np(3)
- isnan(3)
- getprotoent(3)
- catclose(3)
- getsid(2)
- endrpcent(3)
- fts_close(3)
- gnu_dev_minor(3)
- ruserok_af(3)
- getutent_r(3)
- getegid(2)
- sgetmask(2)
- posix_memalign(3)
- atanf(3)
- unshare(2)
- lremovexattr(2)
- strncasecmp(3)
- endutent(3)
- updwtmpx(3)
- outsw(2)
- sched_getparam(2)
- setuid32(2)
- catgets(3)
- nextupl(3)
- openat(2)
- logout(3)
- free(3)
- setfsuid(2)
- getutline(3)
- svc_sendreply(3)
- fadvise64_64(2)
- cargf(3)
- __ppc_set_ppr_low(3)
- casinh(3)
- outb_p(2)
- fputwc(3)
- log10f(3)
- getnetgrent(3)
- fputws_unlocked(3)
- ffsl(3)
- endttyent(3)
- isgreater(3)
- sigmask(3)
- sgetspent_r(3)
- fmaxf(3)
- openlog(3)
- strncmp(3)
- closedir(3)
- rexec_af(3)
- exp2(3)
- mcheck(3)
- isalpha(3)
- pthread_mutex_init(3)
- catopen(3)
- clock_nanosleep(2)
- ioctl(2)
- remainder(3)
- olduname(2)
- getcpu(2)
- setns(2)
- asinhl(3)
- wcscasecmp(3)
- nearbyintl(3)
- atan2f(3)
- wctob(3)
- nextdownf(3)
- gmtime_r(3)
- fmal(3)
- setfsgid32(2)
- dlinfo(3)
- posix_spawnp(3)
- fgets_unlocked(3)
- major(3)
- fseek(3)
- xdr_callhdr(3)
- execve(2)
- exit(3)
- makecontext(3)
- sysctl(2)
- oldolduname(2)
- getgrouplist(3)
- pthread_getattr_np(3)
- ffs(3)
- sem_init(3)
- gcvt(3)
- fts_children(3)
- rt_sigreturn(2)
- mallinfo(3)
- insl(2)
- geteuid(2)
- signalfd(2)
- erfcl(3)
- sched_get_priority_min(2)
- sched_setaffinity(2)
- wcsrchr(3)
- xdr_reference(3)
- snprintf(3)
- delete_module(2)
- j0f(3)
- malloc_hook(3)
- casinf(3)
- y0f(3)
- endgrent(3)
- y1l(3)
- pthread_create(3)
- wcsncasecmp(3)
- pidfd_getfd(2)
- htobe64(3)
- _sysctl(2)
- lrand48_r(3)
- warnx(3)
- lgammaf_r(3)
- verrx(3)
- finit_module(2)
- gsignal(3)
- recvfrom(2)
- log2(3)
- fflush_unlocked(3)
- getaliasbyname_r(3)
- pthread_mutexattr_setrobust(3)
- getdirentries(3)
- getrpcbyname_r(3)
- ppoll(2)
- tmpfile(3)
- isupper_l(3)
- xdr_free(3)
- res_nquery(3)
- fts_open(3)
- shutdown(2)
- xdr_callmsg(3)
- coshl(3)
- ntp_gettimex(3)
- afs_syscall(2)
- be32toh(3)
- fchmodat(2)
- addseverity(3)
- pause(2)
- strcmp(3)
- mkostemps(3)
- wcsrtombs(3)
- scandir(3)
- __freadable(3)
- killpg(3)
- add_key(2)
- strcoll(3)
- migrate_pages(2)
- pthread_setattr_default_np(3)
- pthread_attr_setsigmask_np(3)
- sigabbrev_np(3)
- readdir(2)
- subpage_prot(2)
- strfromf(3)
- sysv_signal(3)
- gethostbyname2_r(3)
- outl_p(2)
- sync(2)
- pthread_attr_getinheritsched(3)
- socket(2)
- msgrcv(2)
- fgetws(3)
- pthread_cleanup_push_defer_np(3)
- getnetgrent_r(3)
- ynl(3)
- endservent(3)
- srand(3)
- endmntent(3)
- cbrtl(3)
- setitimer(2)
- pmap_rmtcall(3)
- svcerr_systemerr(3)
- fesetround(3)
- ilogbf(3)
- __fwriting(3)
- log1p(3)
- futimens(3)
- xdrrec_endofrecord(3)
- setreuid32(2)
- swab(3)
- pthread_spin_init(3)
- memchr(3)
- fminf(3)
- getipnodebyname(3)
- msgop(2)
- wait(2)
- ether_aton_r(3)
- open_wmemstream(3)
- xdr_bool(3)
- pthread_tryjoin_np(3)
- xdr_int(3)
- inet_net_ntop(3)
- fdimf(3)
- srand48(3)
- xdr_setpos(3)
- asinf(3)
- program_invocation_name(3)
- write(2)
- mkdtemp(3)
- pthread_cleanup_pop(3)
- ptsname_r(3)
- lgammal_r(3)
- pthread_attr_getstackaddr(3)
- authunix_create(3)
- getpmsg(2)
- ceill(3)
- cexp2f(3)
- kcmp(2)
- setup(2)
- err(3)
- sync_file_range2(2)
- getpid(2)
- wcsncat(3)
- envz_get(3)
- futimes(3)
- mincore(2)
- herror(3)
- ether_line(3)
- feholdexcept(3)
- fputc(3)
- keyctl(2)
- timer_delete(2)
- posix_spawn(3)
- faccessat2(2)
- setnetgrent(3)
- pwrite(2)
- aio_read(3)
- shmget(2)
- acosh(3)
- sigdelset(3)
- __ppc_get_timebase(3)
- __flbf(3)
- dladdr1(3)
- argz_create_sep(3)
- mblen(3)
- gethostent(3)
- pciconfig_iobase(2)
- recvmmsg(2)
- isprint_l(3)
- csqrtf(3)
- wcstoimax(3)
- hsearch_r(3)
- svcudp_create(3)
- setreuid(2)
- le16toh(3)
- name_to_handle_at(2)
- strftime_l(3)
- pthread_attr_setschedparam(3)
- eventfd(2)
- atanhf(3)
- pthread_setspecific(3)
- pthread_cond_init(3)
- acosl(3)
- llistxattr(2)
- fputwc_unlocked(3)
- scanf(3)
- getmntent_r(3)
- getchar(3)
- res_ninit(3)
- error_one_per_line(3)
- sigsetmask(3)
- putwchar(3)
- llroundf(3)
- rt_sigpending(2)
- send(2)
- wcsstr(3)
- log2l(3)
- fmod(3)
- va_copy(3)
- res_search(3)
- res_nsend(3)
- res_query(3)
- wait3(2)
- encrypt_r(3)
- system(3)
- close_range(2)
- ecvt_r(3)
- read(2)
- auth_destroy(3)
- realloc(3)
- pipe2(2)
- dn_expand(3)
- timerclear(3)
- get_avphys_pages(3)
- mbsnrtowcs(3)
- strtok(3)
- fwide(3)
- __ppc_get_timebase_freq(3)
- gai_suspend(3)
- stpcpy(3)
- lldiv(3)
- iswxdigit(3)
- posix_openpt(3)
- s390_pci_mmio_write(2)
- pthread_spin_destroy(3)
- callrpc(3)
- getifaddrs(3)
- aio_suspend(3)
- fread_unlocked(3)
- get_nprocs_conf(3)
- getuid(2)
- spu_run(2)
- termios(3)
- umask(2)
- csqrtl(3)
- register_printf_modifier(3)
- sem_trywait(3)
- tee(2)
- msync(2)
- mpool(3)
- setdomainname(2)
- fopencookie(3)
- nl_langinfo(3)
- sockatmark(3)
- getspent_r(3)
- casinhl(3)
- fdiml(3)
- ntohs(3)
- fgets(3)
- time(2)
- casinl(3)
- pthread_detach(3)
- seccomp_unotify(2)
apt-get install manpages-dev
Available languages:
en fr pl ja deManual
clone
NOMBIBLIOTHĂQUE
SYNOPSIS
DESCRIPTION
La fonction enveloppe clone()
clone3()
Ăquivalence entre les paramĂštres de clone() et de clone3()
Signal de fin de lâenfant
Le tableau set_tid
Le masque flags
VALEUR RENVOYĂE
ERREURS
VERSIONS
Différences entre bibliothÚque C et noyau
blackfin, m68k, et sparc
ia64
STANDARDS
HISTORIQUE
Linux 2.4 et antérieurs
NOTES
BOGUES
EXEMPLES
Source du programme
VOIR AUSSI
TRADUCTION
NOM
clone, __clone2, clone3 - Créer un processus enfant (child)
BIBLIOTHĂQUE
BibliothĂšque C standard ( libc , -lc )
SYNOPSIS
/* Prototype de la fonction enveloppe de la glibc */
#define
_GNU_SOURCE
#include <sched.h>
int clone(int
(*
fn
)(void *_Nullable), void
*
stack
, int
flags
,
void *_Nullable
arg
, ...
/*
pid_t
*_Nullable
parent_tid
,
void *_Nullable
tls
,
pid_t *_Nullable
child_tid
*/
);
/* Pour le prototype de lâappel systĂšme clone() brut, voir REMARQUES */
#include
<linux/sched.h>
/* Définition de
struct
clone_args
*/
#include <sched.h>
/* Définition des
constantes
CLONE_*
*/
#include <sys/syscall.h>
/* Définition des
constantes
SYS_*
*/
#include <unistd.h>
long syscall(SYS_clone3, struct clone_args * cl_args , size_t size );
Remarque : La glibc ne fournit pas dâenveloppe pour clone3 ()Â ; appelez-la en utilisant syscall (2).
DESCRIPTION
Ces appels systÚme créent un nouveau processus « enfant », de façon analogue à fork (2).
Contrairement Ă fork (2), ces appels systĂšme offrent un contrĂŽle plus prĂ©cis du contexte dâexĂ©cution partagĂ© entre le processus appelant et son enfant. Par exemple, en utilisant ces appels systĂšme, lâappelant peut contrĂŽler si les deux processus partagent ou non lâespace dâadresse virtuel, la table des descripteurs de fichier et celle des gestionnaires de signal. Ces appels systĂšme permettent Ă©galement au nouveau processus enfant dâaller dans un namespaces (7) Ă part.
Remarquez que dans cette page de manuel, le « processus appelant » correspond en principe au « processus parent ». Mais voir les descriptions de CLONE_PARENT et de CLONE_THREAD ci-dessous.
Cette page décrit les interfaces suivantes :
|
- |
Cette page prĂ©sente Ă la fois la fonction enveloppe clone () de la glibc et lâappel systĂšme sous-jacent sur lequel elle sâappuie. Le texte principal dĂ©crit la fonction enveloppe ; les diffĂ©rences avec lâappel systĂšme brut sont prĂ©cisĂ©es vers la fin de cette page. |
||
|
- |
Le nouvel appel systĂšme clone3 (). |
Dans la suite de cette page, le terme « appel clone » est utilisé pour évoquer les détails applicables à toutes ces interfaces.
La fonction enveloppe clone()
Quand le processus enfant est créé par la fonction enveloppe clone (), il dĂ©bute son exĂ©cution par un appel Ă la fonction vers laquelle pointe lâargument fn (cela est diffĂ©rent de fork (2), pour lequel lâexĂ©cution continue dans le processus enfant Ă partir du moment de lâappel de fork (2)). Lâargument arg est passĂ© comme argument de la fonction fn .
Quand la fonction fn ( arg ) renvoie, le processus enfant se termine. La valeur entiĂšre renvoyĂ©e par fn est utilisĂ©e comme code de retour du processus enfant. Ce dernier peut Ă©galement se terminer de maniĂšre explicite en invoquant la fonction exit (2) ou aprĂšs la rĂ©ception dâun signal fatal.
Lâargument stack indique lâemplacement de la pile utilisĂ©e par le processus enfant. Comme les processus enfant et appelant peuvent partager de la mĂ©moire, il nâest gĂ©nĂ©ralement pas possible pour lâenfant dâutiliser la mĂȘme pile que son parent. Le processus appelant doit donc prĂ©parer un espace mĂ©moire pour stocker la pile de son enfant, et transmettre Ă clone un pointeur sur cet emplacement. Les piles croissent vers le bas sur tous les processeurs implĂ©mentant Linux (sauf le HP PA), donc stack doit pointer sur la plus haute adresse de lâespace mĂ©moire prĂ©vu pour la pile du processus enfant. Remarquez que clone () ne fournit aucun moyen pour que lâappelant puisse informer le noyau de la taille de la zone de la pile.
Les paramÚtres restants de clone () sont décrits ci-dessous.
clone3()
Lâappel systĂšme clone3 () fournit un sur-ensemble de la fonctionnalitĂ© de lâancienne interface de clone (). Il offre Ă©galement un certain nombre dâamĂ©liorations de lâAPI dont : un espace pour des bits dâattributs supplĂ©mentaires, une sĂ©paration plus propre dans lâutilisation de plusieurs paramĂštres et la possibilitĂ© dâindiquer la taille de la zone de la pile de lâenfant.
Comme avec fork (2), clone3 () renvoie Ă la fois au parent et Ă lâenfant. Il renvoie 0 dans le processus enfant et il renvoie le PID de lâenfant dans le parent.
Le paramÚtre cl_args de clone3 () est une structure ayant la forme suivante :
struct
clone_args {
u64 flags; /* Masque de bit dâattribut */
u64 pidfd; /* OĂč stocker le descripteur de fichier du
PID
(
int *
) */
u64 child_tid; /* OĂč stocker le TID enfant,
dans la mĂ©moire de lâenfant (
pid_t *
) */
u64 parent_tid; /* OĂč stocker le TID enfant,
dans la mémoire du parent (
pid_t *
) */
u64 exit_signal; /* Signal Ă envoyer au parent quand
lâenfant se termine */
u64 stack; /* Pointeur vers lâoctet le plus faible de
la pile */
u64 stack_size; /* Taille de la pile */
u64 tls; /* Emplacement du nouveau TLS */
u64 set_tid; /* Pointeur vers un tableau
pid_t
(depuis Linux 5.5) */
u64 set_tid_size; /* Nombre dâĂ©lĂ©ments
dans
set_tid
(depuis Linux 5.5) */
u64 cgroup; /* Descripteur de fichier du cgroup cible
de lâenfant (depuis Linux 5.7) */
};
Le paramĂštre size fourni Ă clone3 () doit ĂȘtre initialisĂ© Ă la taille de cette structure (lâexistence du paramĂštre size autorise des extensions futures de la structure clone_args ).
La pile du processus enfant est indiquĂ©e avec cl_args.stack , qui pointe vers lâoctet le plus faible de la zone de la pile, et avec cl_args.stack_size , qui indique la taille de la pile en octets. Si lâattribut CLONE_VM est indiquĂ© (voir ci-dessous), une pile doit ĂȘtre explicitement allouĂ©e et indiquĂ©e. Sinon, ces deux champs peuvent valoir NULL et 0 , ce qui amĂšne lâenfant Ă utiliser la mĂȘme zone de pile que son parent (dans lâespace dâadressage virtuel de son propre enfant).
Les autres champs du paramÚtre cl_args sont abordés ci-dessous.
Ăquivalence entre les paramĂštres de clone() et de clone3()
Contrairement Ă lâancienne interface clone (), oĂč les paramĂštres sont passĂ©s individuellement, ceux de la nouvelle interface clone3 () sont empaquetĂ©s dans la structure clone_args prĂ©sentĂ©e ci-dessus. Cette structure permet de passer un ensemble dâinformations Ă lâaide des arguments de clone ().
Le tableau suivant montre lâĂ©quivalence entre les paramĂštres de clone () et les champs du paramĂštre clone_args fournis Ă clone3 () :
Signal de fin de lâenfant
Quand le processus enfant se termine, un signal peut ĂȘtre envoyĂ© au parent. Le signal de fin est indiquĂ© dans lâoctet de poids faible de flags ( clone ()) ou dans cl_args.exit_signal ( clone3 ()). Si ce signal est diffĂ©rent de SIGCHLD , le processus parent doit Ă©galement spĂ©cifier les options __WALL ou __WCLONE lorsquâil attend la fin de lâenfant avec wait (2). Si aucun signal nâest indiquĂ© (donc zĂ©ro), le processus parent ne sera pas notifiĂ© de la terminaison de lâenfant.
Le tableau set_tid
Par dĂ©faut, le noyau choisit le PID sĂ©quentiel suivant pour le nouveau processus dans chacun des espaces de noms de PID oĂč il est prĂ©sent. Lors de la crĂ©ation dâun processus avec clone3 (), le tableau set_tid (depuis Linux 5.5) peut ĂȘtre utilisĂ© pour sĂ©lectionner des PID spĂ©cifiques pour le processus dans tout ou partie des espaces de noms oĂč il est prĂ©sent. Si le PID du processus nouvellement créé ne doit ĂȘtre positionnĂ© que dans lâespace de noms du processus actuel ou dans celui du PID nouvellement créé (si flags contient CLONE_NEWPID ), le premier Ă©lĂ©ment du tableau set_tid doit ĂȘtre le PID souhaitĂ© et set_tid_size doit valoir 1 .
Si le PID du processus nouvellement créé doit avoir une certaine valeur dans plusieurs espaces de noms de PID, le tableau set_tid peut avoir plusieurs entrĂ©es. La premiĂšre entrĂ©e dĂ©finit le PID de lâespace de noms le plus imbriquĂ©, puis chacune des entrĂ©es suivantes contient le PID de lâespace de noms supĂ©rieur correspondant. Le nombre dâespaces de noms de PID oĂč un PID doit ĂȘtre positionnĂ© est dĂ©fini par set_tid_size , qui ne peut pas ĂȘtre plus grand que le nombre dâespaces de noms de PID imbriquĂ©s.
Pour crĂ©er un processus dont les PID suivants sâinscrivent dans la hiĂ©rarchie de lâespace de noms de PID :
Positionner le tableau sur :
set_tid[0] = 7;
set_tid[1] = 42;
set_tid[2] = 31496;
set_tid_size = 3;
Si seuls les PID des deux espaces de noms de PID les plus Ă lâintĂ©rieur doivent ĂȘtre indiquĂ©s, positionnez le tableau sur :
set_tid[0] = 7;
set_tid[1] = 42;
set_tid_size = 2;
Le PID dans les espaces de noms de PID en dehors des deux espaces de noms les plus Ă lâintĂ©rieur sera sĂ©lectionnĂ© de la mĂȘme maniĂšre quâon sĂ©lectionne nâimporte quel autre PID.
La fonctionnalitĂ© set_tid exige CAP_SYS_ADMIN ou (depuis Linux 5.9) CAP_CHECKPOINT_RESTORE dans tous les espaces de noms appartenant Ă lâutilisateur des espaces de noms du processus cible.
Les appelants ne peuvent choisir quâun PID supĂ©rieur Ă 1 dans un espace de noms de PID donnĂ© si un processus init (Ă savoir un processus dont le PID est 1 ) existe dĂ©jĂ dans cet espace de noms. Sinon, lâentrĂ©e du PID dans cet espace de noms de PID doit valoir 1 .
Le masque flags
Tant clone () que clone3 () permettent dâutiliser un masque de bit flags pour modifier leur comportement, et elles permettent Ă lâappelant dâindiquer ce qui est partagĂ© entre le processus appelant et son enfant. Ce masque de bit â le paramĂštre flags de clone () ou le champ cl_args.flags passĂ© Ă clone3 () â est dĂ©signĂ© comme le masque flags dans le reste de cette page.
Le masque
flags
est indiqué comme un OU binaire de
zéro ou plus des constantes ci-dessous. Sauf
explicitement indiqués, ces attributs sont
disponibles (et ont le mĂȘme effet) dans
clone
()
et dans
clone3
().
CLONE_CHILD_CLEARTID
(depuis Linux 2.5.49)
Effacer (zĂ©ro) lâID du thread enfant situĂ© lĂ oĂč pointe child_tid ( clone ()) ou cl_args.child_tid ( clone3 ()) dans la mĂ©moire de lâenfant lorsquâil se termine, et provoquer le rĂ©veil avec le futex Ă cette adresse. Lâadresse concernĂ©e peut ĂȘtre modifiĂ©e par lâappel systĂšme set_tid_address (2). Cela est utilisĂ© dans les bibliothĂšques de gestion de threads.
CLONE_CHILD_SETTID (depuis Linux 2.5.49)
Enregistrer lâID du thread de lâenfant lĂ oĂč pointe child_tid (( clone ()) ou cl_args.child_tid ( clone3 ()) dans la mĂ©moire de lâenfant. LâopĂ©ration dâenregistrement se termine avant que lâappel clone ne redonne le contrĂŽle Ă lâespace utilisateur dans le processus enfant (remarquez que lâopĂ©ration dâenregistrement peut ne pas ĂȘtre terminĂ©e avant que lâappel clone ne renvoie au processus parent, ce qui sera pertinent si lâattribut CLONE_VM est Ă©galement utilisĂ©).
CLONE_CLEAR_SIGHAND (depuis Linux 5.5)
Par dĂ©faut, lâĂ©tat des signaux du thread de lâenfant est le mĂȘme que celui du parent. Si cet attribut est positionnĂ©, tous les signaux gĂ©rĂ©s par le parent (et non dĂ©finis Ă SIG_IGN ) sont rĂ©initialisĂ©s Ă leur Ă©tat par dĂ©faut ( SIG_DFL ) dans lâenfant.
Indiquer cet attribut avec CLONE_SIGHAND nâa pas de sens et nâest pas autorisĂ©.
CLONE_DETACHED (historique)
Pendant un moment (pendant la sĂ©rie de versions au cours du dĂ©veloppement de Linux 2.5), il y a eu un attribut CLONE_DETACHED , avec lequel le parent ne recevait pas de signal quand lâenfant se terminait. Au final, lâeffet de cet attribut a Ă©tĂ© inhibĂ© par lâattribut CLONE_THREAD et quand Linux 2.6.0 a Ă©tĂ© publiĂ©, cet attribut nâavait pas dâeffet. Ă partir de Linux 2.6.2, il nâa plus Ă©tĂ© nĂ©cessaire de fournir cet attribut avec CLONE_THREAD .
Cet attribut est toujours dĂ©fini, mais il est gĂ©nĂ©ralement ignorĂ© lors dâun appel clone (). Toutefois, voir la description de CLONE_PIDFD pour certaines exceptions.
CLONE_FILES (depuis Linux 2.0)
Si lâattribut CLONE_FILES est positionnĂ©, le processus appelant et le processus enfant partagent la mĂȘme table de descripteurs de fichier. Tout descripteur créé par un processus est Ă©galement valable pour lâautre processus. De mĂȘme si un processus ferme un descripteur, ou modifie ses attributs (en utilisant lâopĂ©ration fcntl (2) F_SETFD ), lâautre processus en est aussi affectĂ©. Si un processus qui partage une table de descripteurs de fichier appelle execve (2), sa table est dupliquĂ©e (non partagĂ©e).
Si CLONE_FILES nâest pas positionnĂ©, le processus enfant hĂ©rite dâune copie des descripteurs de fichier ouverts par lâappelant au moment de lâappel clone (). Les opĂ©rations dâouverture et de fermeture ou de modification dâattributs du descripteur de fichier subsĂ©quentes, effectuĂ©es par le processus appelant ou son enfant, ne concernent pas lâautre processus. Remarquez toutefois que les copies des descripteurs de fichier dans lâenfant sont associĂ©es aux mĂȘmes descriptions de fichiers ouverts que les descripteurs de fichier correspondants dans le processus appelant, partageant ainsi les attributs de position et dâĂ©tats du fichier (consultez open (2)).
CLONE_FS (depuis Linux 2.0)
Si lâattribut CLONE_FS est positionnĂ©, le processus appelant et le processus enfant partagent les mĂȘmes informations concernant le systĂšme de fichiers. Cela inclut la racine du systĂšme de fichiers, le rĂ©pertoire de travail, et lâumask. Tout appel Ă chroot (2), chdir (2) ou umask (2) effectuĂ© par un processus aura Ă©galement une influence sur lâautre processus.
Si CLONE_FS nâest pas positionnĂ©, le processus enfant travaille sur une copie des informations de lâappelant concernant le systĂšme de fichiers au moment de lâappel clone. Les appels Ă chroot (2), chdir (2), umask (2) effectuĂ©s ensuite par un processus nâaffectent pas lâautre processus.
CLONE_INTO_CGROUP (depuis Linux 5.7)
Par dĂ©faut, un processus enfant est mis dans le mĂȘme cgroup version 2 que son parent. Lâattribut CLONE_INTO_CGROUP permet au processus enfant dâĂȘtre créé dans un cgroup version 2 diffĂ©rent (remarquez que CLONE_INTO_CGROUP nâa dâeffet que sur les cgroup version 2).
Pour mettre le processus enfant dans un cgroup diffĂ©rent, lâappelant indique CLONE_INTO_CGROUP dans cl_args.flags et passe un descripteur de fichier qui se rapporte Ă un cgroup version 2 du champ cl_args.cgroup (le descripteur de fichier peut ĂȘtre obtenu en ouvrant un rĂ©pertoire cgroup v2, en utilisant lâattribut O_RDONLY ou O_PATH ). Remarquez que toutes les restrictions habituelles (dĂ©crites dans cgroups (7)) quant au positionnement dâun processus dans un cgroup version 2 sâappliquent.
Voici certains des cas dâutilisation possibles de CLONE_INTO_CGROUP :
|
- |
CrĂ©er un processus dans un autre cgroup que celui du parent permet au gestionnaire de service de placer directement de nouveaux services dans des cgroup dĂ©diĂ©s. Cela Ă©limine les contraintes comptables qui existeraient si le processus enfant Ă©tait créé dâabord dans le mĂȘme cgroup que le parent puis dĂ©placĂ© dans un cgroup cible. De plus, la crĂ©ation dâun processus enfant directement dans un cgroup cible coĂ»te beaucoup moins cher que de dĂ©placer le processus enfant dans le cgroup cible aprĂšs lâavoir créé. |
||
|
- |
Lâattribut CLONE_INTO_CGROUP permet Ă©galement la crĂ©ation de processus enfants gelĂ©s en les crĂ©ant dans un cgroup gelĂ© (voir cgroups (7) pour une description des contrĂŽleurs de gel). |
||
|
- |
Pour les applications threadĂ©es (voire mĂȘme les implĂ©mentations de thread qui utilisent des cgroup pour limiter les threads individuels), il est possible dâĂ©tablir une couche de cgroup fixe avant de crĂ©er chaque thread directement dans son cgroup cible. |
CLONE_IO (depuis Linux 2.6.25)
Si CLONE_IO est dĂ©fini, alors le nouveau processus partage un contexte dâentrĂ©es-sorties avec le processus appelant. Si cet attribut nâest pas dĂ©fini, alors (comme pour fork (2)) le nouveau processus a son propre contexte dâentrĂ©es-sorties.
Le contexte dâentrĂ©es-sorties correspond Ă la visibilitĂ© que lâordonnanceur de disques a des entrĂ©es-sorties (câest-Ă -dire, ce que lâordonnanceur dâentrĂ©es-sorties utilise pour modĂ©liser lâordonnancement des entrĂ©es-sorties dâun processus). Si des processus partagent le mĂȘme contexte dâentrĂ©es-sorties, ils sont traitĂ©s comme un seul par lâordonnanceur dâentrĂ©es-sorties. Par consĂ©quent, ils partagent le mĂȘme temps dâaccĂšs aux disques. Pour certains ordonnanceurs dâentrĂ©es-sorties, si deux processus partagent un contexte dâentrĂ©es-sorties, ils seront autorisĂ©s Ă intercaler leurs accĂšs disque. Si plusieurs threads utilisent des entrĂ©es-sorties pour le mĂȘme processus ( aio_read (3), par exemple), ils devraient utiliser CLONE_IO pour obtenir de meilleures performances dâentrĂ©es-sorties.
Si le noyau nâa pas Ă©tĂ© configurĂ© avec lâoption CONFIG_BLOCK , cet attribut nâa aucun effet.
CLONE_NEWCGROUP (depuis Linux 4.6)
CrĂ©er le processus dans un nouvel espace de noms cgroup. Si cet attribut nâest pas invoquĂ©, alors (comme pour fork (2)) le processus est créé dans le mĂȘme espace de noms cgroup que le processus appelant.
Pour plus dâinformations sur les espaces de noms cgroup, consultez cgroup_namespaces (7).
Seul un processus disposant de privilĂšges ( CAP_SYS_ADMIN ) peut utiliser CLONE_NEWCGROUP .
CLONE_NEWIPC (depuis Linux 2.6.19)
Si CLONE_NEWIPC est invoquĂ©, alors le processus est créé dans un nouvel espace de noms utilisateur IPC. Si cet attribut nâest pas invoquĂ©, alors (comme pour fork (2)) le processus est créé dans le mĂȘme espace de noms utilisateur IPC que le processus appelant.
Pour plus dâinformations sur les espaces de noms IPC, reportez vous Ă ipc_namespaces (7).
Seul un processus disposant de privilĂšges ( CAP_SYS_ADMIN ) peut utiliser CLONE_NEWIPC . Cet attribut ne peut pas ĂȘtre employĂ© en association avec CLONE_SYSVSEM .
CLONE_NEWNET (depuis Linux 2.6.24)
(LâimplĂ©mentation de cet attribut nâest complĂšte que depuis Linux 2.6.29.)
Si CLONE_NEWNET est invoquĂ©, alors le processus est créé dans un nouvel espace de noms rĂ©seau. Si cet attribut nâest pas invoquĂ©, alors (comme pour fork (2)) le processus est créé dans le mĂȘme espace de noms rĂ©seau que le processus appelant.
Pour plus dâinformations sur les espaces de noms rĂ©seau, reportez vous Ă network_namespaces (7).
Seul un processus disposant de privilĂšges ( CAP_SYS_ADMIN ) peut appeler CLONE_NEWNET .
CLONE_NEWNS (depuis Linux 2.4.19)
Si lâattribut CLONE_NEWNS est invoquĂ©, lâenfant clonĂ© dĂ©marre dans un nouvel espace de noms de montage, initialisĂ© avec une copie de lâespace de noms du parent. Si CLONE_NEWNS nâest pas invoquĂ©, alors lâenfant existe dans le mĂȘme espace de noms de montage que le parent.
Pour plus dâinformations sur les espaces de noms de montage, consultez namespaces (7) et mount_namespaces (7).
Seul un processus disposant de privilĂšges ( CAP_SYS_ADMIN ) peut utiliser lâattribut CLONE_NEWNS . Il nâest pas possible de spĂ©cifier Ă la fois CLONE_NEWNS et CLONE_FS pour le mĂȘme appel clone.
CLONE_NEWPID (depuis Linux 2.6.24)
Si CLONE_NEWPID est invoquĂ©, alors le processus est créé dans un nouvel espace de noms PID. Si cet attribut nâest pas invoquĂ©, alors (comme pour fork (2)) le processus est créé dans le mĂȘme espace de noms PID que le processus appelant.
Pour plus dâinformations sur les espaces de noms PID, consultez namespaces (7) et pid_namespaces (7).
Seul un processus disposant de privilĂšges ( CAP_SYS_ADMIN ) peut utiliser CLONE_NEWPID . Cet attribut ne peut pas ĂȘtre employĂ© en association avec CLONE_THREAD .
CLONE_NEWUSER
(Cet attribut est apparu dans clone () pour la premiÚre fois dans Linux 2.6.23, les sémantiques actuelles de clone () ont été ajoutées dans Linux 3.5, et les derniers modules rendant les espaces de noms utilisateur complÚtement opérationnels sont apparus dans Linux 3.8.)
Si CLONE_NEWUSER est invoquĂ©, alors le processus est créé dans un nouvel espace de noms utilisateur. Si cet attribut nâest pas invoquĂ©, alors (comme pour fork (2)) le processus est créé dans le mĂȘme espace de noms utilisateur que le processus appelant.
Pour plus dâinformations sur les espaces de noms utilisateur, consultez namespaces (7) et user_namespaces (7).
Avant Linux 3.8, les processus appelant devaient disposer de trois capacitĂ©s pour utiliser CLONE_NEWUSER : CAP_SYS_ADMIN , CAP_SETUID et CAP_SETGID . Ă partir de Linux 3.8, il nâest plus nĂ©cessaire de disposer de privilĂšges pour crĂ©er des espaces de noms utilisateur.
Cet attribut ne peut pas ĂȘtre utilisĂ© en association avec CLONE_THREAD ou avec CLONE_PARENT . Pour des raisons de sĂ©curitĂ©, CLONE_NEWUSER ne peut pas ĂȘtre utilisĂ© en association avec CLONE_FS .
CLONE_NEWUTS (depuis Linux 2.6.19)
Si CLONE_NEWUTS est dĂ©fini, crĂ©ez le processus dans un nouvel espace de noms UTS, dont les identifiants sont initialisĂ©s en dupliquant les identifiants de lâespace de noms UTS du processus appelant. Si cet attribut nâest pas dĂ©fini, alors (comme pour fork (2)) le processus est créé dans le mĂȘme espace de noms UTS que le processus appelant.
Pour obtenir plus dâinformations sur les espaces de noms UTS, consultez namespaces (7).
Seul un processus disposant de privilĂšges ( CAP_SYS_ADMIN ) peut utiliser CLONE_NEWUTS .
CLONE_PARENT (depuis Linux 2.3.12)
Si CLONE_PARENT est prĂ©sent, le parent du nouvel enfant (comme il est indiquĂ© par getppid (2)) sera le mĂȘme que celui du processus appelant.
Si CLONE_PARENT nâest pas fourni, alors (comme pour fork (2)) le parent du processus enfant sera le processus appelant.
Remarquez que câest le processus parent, tel quâindiquĂ© par getppid (2), qui est notifiĂ© lors de la fin de lâenfant. Ainsi, si CLONE_PARENT est prĂ©sent, alors câest le parent du processus appelant, et non ce dernier, qui sera notifiĂ©.
Lâattribut CLONE_PARENT ne peut pas ĂȘtre utilisĂ© dans des appels clone par le processus dâinitialisation global (PID 1 dans lâespace de noms PID initial) et par les processus initiaux dans les autres espaces de noms PID. Cette restriction empĂȘche la crĂ©ation dâarbres de processus Ă plusieurs racines ou de zombies non rĂ©cupĂ©rables dans lâespace de noms PID initial.
CLONE_PARENT_SETTID (depuis Linux 2.5.49)
Enregistrer lâID du thread enfant Ă lâendroit vers lequel pointe parent_tid ( clone ()) ou cl_args.parent_tid ( clone3 ()) dans la mĂ©moire du parent (dans Linux 2.5.32-2.5.48 il y a un attribut CLONE_SETTID qui fait cela). LâopĂ©ration dâenregistrement sâachĂšve avant que lâopĂ©ration clone ne donne le contrĂŽle Ă lâespace utilisateur.
CLONE_PID (de Linux 2.0 Ă Linux 2.5.15)
Si lâattribut CLONE_PID est positionnĂ©, les processus appelant et enfant ont le mĂȘme numĂ©ro de processus. Câest bien pour bidouiller le systĂšme, mais autrement il nâest plus utilisĂ©. Depuis Linux 2.3.21, cet attribut ne peut ĂȘtre utilisĂ© que par le processus de dĂ©marrage du systĂšme (PID 0). Il a disparu dans Linux 2.5.16. Si bien que le noyau ignorait silencieusement le bit sâil Ă©tait indiquĂ© dans le masque flags . Bien plus tard, le mĂȘme bit a Ă©tĂ© recyclĂ© pour ĂȘtre utilisĂ© comme attribut de CLONE_PIDFD .
CLONE_PIDFD (depuis Linux 5.2)
Si cet attribut est indiquĂ©, un descripteur de fichier PID renvoyant au processus enfant est allouĂ© et placĂ© Ă un endroit donnĂ© dans la mĂ©moire du parent. Lâattribut close-on-exec est positionnĂ© sur ce nouveau descripteur de fichier. Les descripteurs de fichier PID peuvent ĂȘtre utilisĂ©s pour des objectifs dĂ©crits dans pidfd_open (2).
|
- |
Quand on utilise clone3 (), le descripteur de fichier PID est placé à un endroit vers lequel pointe cl_args.pidfd . |
||
|
- |
Quand on utilise clone (), le descripteur de fichier PID est placĂ© Ă un endroit vers lequel pointe parent_tid . Comme le paramĂštre parent_tid est utilisĂ© pour renvoyer le descripteur de fichier PID, CLONE_PIDFD ne peut pas ĂȘtre utilisĂ© avec CLONE_PARENT_SETTID lors dâun appel clone (). |
Il nâest pas possible actuellement dâutiliser cet attribut avec CLONE_THREAD. Cela veut dire que le processus identifiĂ© par le descripteur de fichier PID sera toujours un leader dans le groupe de threads.
Si lâattribut obsolĂšte CLONE_DETACHED est indiquĂ© avec CLONE_PIDFD lors dâun appel Ă clone (), une erreur est renvoyĂ©e. Une erreur se produit aussi si CLONE_DETACHED est spĂ©cifiĂ© lors dâun appel Ă clone3 (). Ce comportement garantit que le bit qui correspond Ă CLONE_DETACHED pourra ĂȘtre utilisĂ© Ă lâavenir pour des fonctionnalitĂ©s supplĂ©mentaires du descripteur de fichier PID.
CLONE_PTRACE (depuis Linux 2.2)
Si lâattribut CLONE_PTRACE est positionnĂ© et si lâappelant est suivi par un dĂ©bogueur, alors lâenfant sera Ă©galement suivi (consultez ptrace (2)).
CLONE_SETTLS (depuis Linux 2.5.32)
Le descripteur TLS (Thread Local Storage) est positionné sur tls .
LâinterprĂ©tation de tls et les effets qui en dĂ©coulent dĂ©pendent de lâarchitecture. Sur x86, tls est interprĂ©tĂ© comme une struct user_desc * (voir set_thread_area (2)). Sur x86-64, il sâagit de la nouvelle valeur Ă positionner pour le registre de base %fs (voir le paramĂštre ARCH_SET_FS de arch_prctl (2)). Sur les architectures ayant un registre TLS dĂ©diĂ©, il sâagit de la nouvelle valeur de ce registre.
Lâutilisation de cet attribut exige une connaissance dĂ©taillĂ©e et nâest gĂ©nĂ©ralement pas souhaitable, sauf dans lâimplĂ©mentation de bibliothĂšques de gestion des threads.
CLONE_SIGHAND (depuis Linux 2.0)
Si lâattribut CLONE_SIGHAND est positionnĂ©, le processus appelant et le processus enfant partagent la mĂȘme table de gestionnaires de signaux. Si lâappelant, ou lâenfant, appelle sigaction (2) pour modifier le comportement associĂ© Ă un signal, ce comportement est Ă©galement changĂ© pour lâautre processus. NĂ©anmoins, lâappelant et lâenfant ont toujours des masques de signaux distincts, et leurs ensembles de signaux bloquĂ©s sont indĂ©pendants. Lâun des processus peut donc bloquer ou dĂ©bloquer un signal en utilisant sigprocmask (2) sans affecter lâautre processus.
Si CLONE_SIGHAND nâest pas utilisĂ©, le processus enfant hĂ©rite dâune copie des gestionnaires de signaux de lâappelant lors de lâinvocation de clone (). Les appels Ă sigaction (2) effectuĂ©s ensuite depuis lâun des processus nâont pas dâeffets sur lâautre processus.
Depuis Linux 2.6.0, le masque flags doit aussi inclure CLONE_VM si CLONE_SIGHAND est spécifié
CLONE_STOPPED (depuis Linux 2.6.0)
Si lâattribut CLONE_STOPPED est positionnĂ©, lâenfant est initialement stoppĂ© (comme sâil avait reçu le signal SIGSTOP ), et doit ĂȘtre relancĂ© en lui envoyant le signal SIGCONT .
Cet attribut a Ă©tĂ© rendu obsolĂšte par Linux 2.6.25, puis il a Ă©tĂ© supprimĂ© dans Linux 2.6.38. Depuis lors, le noyau lâignore silencieusement sans erreur. Ă partir de Linux 4.6, le mĂȘme bit a Ă©tĂ© rĂ©utilisĂ© comme attribut de CLONE_NEWCGROUP .
CLONE_SYSVSEM (depuis Linux 2.5.10)
Si CLONE_SYSVSEM est positionnĂ©, lâenfant et le processus appelant partagent une mĂȘme liste de valeurs dâajustement de sĂ©maphores System V (consultez semop (2)). Dans ce cas, cette liste regroupe toutes les valeurs semadj des processus partageant cette liste, et les modifications des sĂ©maphores sont effectuĂ©es seulement lorsque le dernier processus de la liste se termine (ou cesse de partager la liste en invoquant unshare (2)). Si cet attribut nâest pas utilisĂ©, lâenfant a une liste semadj sĂ©parĂ©e, initialement vide.
CLONE_THREAD (depuis Linux 2.4.0)
Si CLONE_THREAD est prĂ©sent, lâenfant est placĂ© dans le mĂȘme groupe de threads que le processus appelant. Afin de rendre lâexplication de CLONE_THREAD plus lisible, le terme « thread » est utilisĂ© pour parler des processus dans un mĂȘme groupe de threads.
Les groupes de threads sont une fonctionnalitĂ© ajoutĂ©e dans Linux 2.4 pour gĂ©rer la notion POSIX dâensemble de threads partageant un mĂȘme PID. En interne, ce PID partagĂ© est appelĂ© identifiant de groupe de threads (TGID). Depuis Linux 2.4, lâappel getpid (2) renvoie lâidentifiant du groupe de threads de lâappelant.
Les threads dans un groupe peuvent ĂȘtre distinguĂ©s par leur identifiant de thread (TID, unique sur le systĂšme). Le TID dâun nouveau thread est disponible sous la forme du rĂ©sultat dâune fonction renvoyĂ© Ă lâappelant et un thread peut obtenir son propre TID en utilisant gettid (2).
Quand clone est appelé sans positionner CLONE_THREAD , le nouveau thread est placé dans un nouveau groupe de threads dont le TGID est identique au TID du nouveau thread. Ce thread est le leader du nouveau groupe.
Un nouveau thread créé en utilisant CLONE_THREAD a le mĂȘme processus parent que le processus rĂ©alisant lâappel clone (de mĂȘme quâavec CLONE_PARENT ), ainsi les appels Ă getppid (2) renvoient la mĂȘme valeur Ă tous les threads dans un mĂȘme groupe. Lorsquâun thread créé avec CLONE_THREAD termine, le thread qui lâa créé ne reçoit pas le signal SIGCHLD (ou autre notification de terminaison) ; de mĂȘme, lâĂ©tat dâun tel thread ne peut pas ĂȘtre obtenu par wait (2). Le thread est dit dĂ©tachĂ© .
Lorsque tous les threads dâun groupe de threads terminent, le processus parent du groupe reçoit un signal SIGCHLD (ou un autre indicateur de terminaison).
Si lâun des threads dans un groupe de threads appelle execve (2), tous les threads sauf le leader sont tuĂ©s, et le nouveau programme est exĂ©cutĂ© dans le leader du groupe de threads.
Si lâun des threads dans un groupe crĂ©e un enfant avec fork (2), nâimporte lequel des threads du groupe peut utiliser wait (2) sur cet enfant.
Depuis Linux 2.5.35, le masque flags doit aussi inclure CLONE_SIGHAND si CLONE_THREAD est spécifié (et remarquez que depuis Linux 2.6.0, CLONE_SIGHAND a également besoin de CLONE_VM ).
Les gestions de signaux sont définies au niveau des processus : si un signal sans gestionnaire est reçu par un thread, il affectera (tuera, stoppera, relancera, ou sera ignoré par) tous les membres du groupe de threads.
Chaque thread a son propre masque de signal, tel que défini par sigprocmask (2).
Un signal peut ĂȘtre adressĂ© Ă un processus ou Ă un thread. Sâil sâadresse Ă un processus, il cible un groupe de threads (câest-Ă -dire un TGID), et il est envoyĂ© Ă un thread choisi arbitrairement parmi ceux ne bloquant pas les signaux. Un signal peut sâadresser Ă un processus car il est gĂ©nĂ©rĂ© par le noyau pour dâautres raisons quâune exception matĂ©rielle, ou parce quâil a Ă©tĂ© envoyĂ© en utilisant kill (2) ou sigqueue (3). Si un signal sâadresse Ă un thread, il cible (donc est envoyĂ©) Ă un thread spĂ©cifique. Un signal peut sâadresser Ă un thread du fait dâun envoi par tgkill (2) ou pthread_sigqueue (3), ou parce que le thread a exĂ©cutĂ© une instruction en langage machine qui a provoquĂ© une exception matĂ©rielle (comme un accĂšs non valable en mĂ©moire, provoquant SIGSEGV , ou une exception de virgule flottante provoquant un SIGFPE ).
Un appel à sigpending (2) renvoie un jeu de signaux qui réunit les signaux en attente adressés au processus et ceux en attente pour le thread appelant.
Si un signal adressĂ© Ă un processus est envoyĂ© Ă un groupe de threads, et si le groupe a installĂ© un gestionnaire pour ce signal, alors le gestionnaire sera exĂ©cutĂ© exactement dans un des membres du groupe de threads, choisi de façon arbitraire parmi ceux qui nâont pas bloquĂ© ce signal. Si plusieurs threads dans un groupe attendent le mĂȘme signal en utilisant sigwaitinfo (2), le noyau choisira arbitrairement lâun dâentre eux pour recevoir le signal.
CLONE_UNTRACED (depuis Linux 2.5.46)
Si lâattribut CLONE_UNTRACED est positionnĂ©, alors un processus traçant le parent ne peut pas forcer CLONE_PTRACE pour cet enfant.
CLONE_VFORK (depuis Linux 2.2)
Si le bit CLONE_VFORK est actif, lâexĂ©cution du processus appelant est suspendue jusquâĂ ce que lâenfant libĂšre ses ressources de mĂ©moire virtuelle par un appel execve (2) ou _exit (2) (comme avec vfork (2)).
Si CLONE_VFORK nâest pas indiquĂ©, alors les deux processus sont ordonnancĂ©s Ă partir de la fin de lâappel, et lâapplication ne devrait pas considĂ©rer que lâordre dâexĂ©cution est dĂ©terminĂ© dans un ordre particulier.
CLONE_VM (depuis Linux 2.0)
Si le bit CLONE_VM est actif, le processus appelant et le processus enfant sâexĂ©cutent dans le mĂȘme espace mĂ©moire. En particulier, les Ă©critures en mĂ©moire effectuĂ©es par lâun des processus sont visibles par lâautre. De mĂȘme toute projection en mĂ©moire, ou toute suppression de projection, effectuĂ©e avec mmap (2) ou munmap (2) par lâun des processus affectera Ă©galement lâautre processus.
Si CLONE_VM nâest pas actif, le processus enfant utilisera une copie distincte de lâespace mĂ©moire de lâappelant au moment de lâappel clone. Les Ă©critures ou les associations/dĂ©sassociations de fichiers en mĂ©moire effectuĂ©es par un processus nâaffectent pas lâautre processus, comme cela se passe avec fork (2).
Si lâattribut CLONE_VM est indiquĂ© et si lâattribut CLONE_VFORK ne lâest pas, toute autre pile de signal mise en place par sigaltstack (2) sera vidĂ©e dans le processus enfant.
VALEUR RENVOYĂE
En cas de rĂ©ussite, le TID du processus enfant est renvoyĂ© dans le thread dâexĂ©cution de lâappelant. En cas dâĂ©chec, -1 est renvoyĂ© dans le contexte de lâappelant, aucun enfant nâest créé, et errno sera positionnĂ© pour indiquer lâerreur.
ERREURS
EACCES ( clone3 () seulement)
CLONE_INTO_CGROUP Ă©tait indiquĂ© dans cl_args.flags , mais les restrictions Ă la mise en place dâun processus enfant dans un cgroup version 2 auquel se rapporte cl_args.cgroup (dĂ©crites dans cgroups (7)) ne sont pas respectĂ©es.
|
EAGAIN |
Trop de processus en cours dâexĂ©cution. Consultez fork (2). |
EBUSY ( clone3 () seulement)
CLONE_INTO_CGROUP Ă©tait indiquĂ© dans cl_args.flags , mais le descripteur de fichier indiquĂ© dans cl_args.cgroup se rapporte Ă un cgroup version 2 oĂč un contrĂŽleur de domaine est activĂ©.
EEXIST ( clone3 () seulement)
Un (ou plusieurs) PID indiquĂ© dans le set_tid existe dĂ©jĂ dans lâespace de noms PID correspondant.
|
EINVAL |
Tant CLONE_SIGHAND que CLONE_CLEAR_SIGHAND ont été indiqués dans le masque flags . |
||
|
EINVAL |
CLONE_SIGHAND a été spécifié dans le masque flags , mais pas CLONE_VM (depuis Linux 2.6.0). |
||
|
EINVAL |
CLONE_THREAD a été spécifié dans le masque flags , mais pas CLONE_SIGHAND (depuis Linux 2.5.35). |
||
|
EINVAL |
CLONE_THREAD a Ă©tĂ© indiquĂ© dans le masque flags mais le processus actuel avait appelĂ© unshare (2) avec lâattribut CLONE_NEWPID ou il utilisait setns (2) pour se rĂ©associer Ă lâespace de noms PID. |
||
|
EINVAL |
Tant CLONE_FS que CLONE_NEWNS ont été indiqués dans le masque flags . |
EINVAL (depuis Linux 3.9)
Tant CLONE_NEWUSER que CLONE_FS ont été indiqués dans le masque flags .
|
EINVAL |
Tant CLONE_NEWIPC que CLONE_SYSVSEM ont été indiqués dans le masque flags . |
||
|
EINVAL |
CLONE_NEWPID et CLONE_THREAD ou CLONE_PARENT , seuls ou ensemble,ont été indiqués dans le masque flags . |
||
|
EINVAL |
CLONE_NEWUSER et CLONE_THREAD ont été indiqués dans le masque flags . |
EINVAL (depuis Linux 2.6.32)
CLONE_PARENT a Ă©tĂ© spĂ©cifiĂ© et lâappelant est un processus dâinitialisation.
|
EINVAL |
RenvoyĂ©e par lâenveloppe glibc de clone () quand fn ou stack valent NULL. |
||
|
EINVAL |
CLONE_NEWIPC a Ă©tĂ© spĂ©cifiĂ© dans le masque flags , mais le noyau nâa pas Ă©tĂ© configurĂ© avec les options CONFIG_SYSVIPC et CONFIG_IPC_NS . |
||
|
EINVAL |
CLONE_NEWNET a Ă©tĂ© spĂ©cifiĂ© dans le masque flags , mais le noyau nâa pas Ă©tĂ© configurĂ© avec lâoption CONFIG_NET_NS . |
||
|
EINVAL |
CLONE_NEWPID a Ă©tĂ© spĂ©cifiĂ© dans le masque flags , mais le noyau nâa pas Ă©tĂ© configurĂ© avec lâoption CONFIG_PID_NS . |
||
|
EINVAL |
CLONE_NEWUSER a Ă©tĂ© spĂ©cifiĂ© dans le masque flags , mais le noyau nâa pas Ă©tĂ© configurĂ© avec lâoption CONFIG_USER_NS . |
||
|
EINVAL |
CLONE_NEWUTS a Ă©tĂ© spĂ©cifiĂ© dans le masque flags , mais le noyau nâa pas Ă©tĂ© configurĂ© avec lâoption CONFIG_UTS_NS . |
||
|
EINVAL |
stack nâest pas alignĂ©e sur une limite adaptĂ©e Ă cette architecture. Par exemple, sur aarch64, stack doit ĂȘtre un multiple de 16. |
EINVAL ( clone3 () seulement)
CLONE_DETACHED a été spécifié dans le masque flags .
EINVAL ( clone () seulement)
CLONE_PIDFD a été indiqué avec CLONE_DETACHED dans le masque flags .
|
EINVAL |
CLONE_PIDFD a été indiqué avec CLONE_THREAD dans le masque flags . |
EINVAL ( clone () seulement)
CLONE_PIDFD a été indiqué avec CLONE_PARENT_SETTID dans le masque flags .
EINVAL ( clone3 () seulement)
set_tid_size est supĂ©rieur au nombre de niveaux dans lâespace de noms PID.
EINVAL ( clone3 () seulement)
Un des PID indiquĂ© dans set_tid nâĂ©tait pas valable.
EINVAL ( clone3 () seulement)
CLONE_THREAD ou CLONE_PARENT ont été spécifiés dans le masque flags , mais un signal a été spécifié dans exit_signal .
EINVAL (AArch64 seulement, Linux 4.6 et antérieur)
stack nâĂ©tait pas alignĂ© sur une limite de 128 bits.
|
ENOMEM |
Pas assez de mĂ©moire pour copier les parties du contexte du processus appelant qui doivent ĂȘtre dupliquĂ©es, ou pour allouer une structure de tĂąche pour le processus enfant. |
ENOSPC (depuis Linux 3.7)
CLONE_NEWPID a Ă©tĂ© spĂ©cifiĂ© dans le masque flags , et lâappel provoquerait un dĂ©passement de la limite du nombre maximal dâespaces de noms utilisateur imbriquĂ©s. Consultez pid_namespaces (7).
ENOSPC (depuis Linux 4.9Â ; auparavant EUSERS )
CLONE_NEWUSER a Ă©tĂ© spĂ©cifiĂ© dans le masque flags , et lâappel provoquerait un dĂ©passement de la limite du nombre maximal dâespaces de noms utilisateur imbriquĂ©s. Consultez user_namespaces (7).
De Linux 3.11 Ă Linux 4.8, lâerreur indiquĂ©e dans ce cas Ă©tait EUSERS .
ENOSPC (depuis Linux 4.9)
Une des valeurs dans le masque flags indiquait de créer un nouvel espace de noms utilisateur, mais cela aurait provoqué un dépassement de la limite définie par le fichier correspondant dans /proc/sys/user . Pour plus de détails, voir namespaces (7).
EOPNOTSUPP ( clone3 () seulement)
CLONE_INTO_CGROUP Ă©tait indiquĂ© dans cl_args.flags , mais le descripteur de fichier indiquĂ© dans cl_args.cgroup se rapporte Ă un cgroup version 2 dont lâĂ©tat est domain invalid .
|
EPERM |
CLONE_NEWCGROUP , CLONE_NEWIPC , CLONE_NEWNET , CLONE_NEWNS , CLONE_NEWPID ou CLONE_NEWUTS a été spécifié par un processus non privilégié (processus sans CAP_SYS_ADMIN ). |
||
|
EPERM |
CLONE_PID a Ă©tĂ© spĂ©cifiĂ© par un processus autre que le processus 0 (cette erreur nâarrive que sur Linux 2.5.15 et antĂ©rieurs). |
||
|
EPERM |
CLONE_NEWUSER a Ă©tĂ© spĂ©cifiĂ© dans le masque flags , mais lâidentifiant utilisateur effectif ou lâidentifiant de groupe effectif de lâappelant nâa pas de correspondance dans lâespace de noms parent (consultez user_namespaces (7)). |
EPERM (depuis Linux 3.9)
CLONE_NEWUSER a Ă©tĂ© spĂ©cifiĂ© dans le masque flags et lâappelant se trouve dans un environnement chroot (câest-Ă -dire que le rĂ©pertoire racine de lâappelant ne correspond pas au rĂ©pertoire racine de lâespace de noms de montage dans lequel il se trouve).
EPERM ( clone3 () seulement)
set_tid_size Ă©tait supĂ©rieur Ă zĂ©ro et lâappelant nâa pas la capacitĂ© CAP_SYS_ADMIN dans un ou plusieurs des espaces de noms utilisateur qui possĂšdent les espaces de noms PID correspondants.
ERESTARTNOINTR (depuis Linux 2.6.17)
Lâappel systĂšme a Ă©tĂ© interrompu par un signal et va ĂȘtre redĂ©marrĂ© (cela nâest visible quâĂ lâoccasion dâun trace ()).
EUSERS (Linux 3.11 Ă Linux 4.8)
CLONE_NEWUSER a Ă©tĂ© spĂ©cifiĂ© dans le masque flags , et lâappel provoquerait un dĂ©passement de la limite du nombre maximal dâespaces de noms utilisateur imbriquĂ©s. Voir le point sur lâerreur ENOSPC ci-dessus.
VERSIONS
La fonction enveloppe clone () de la glibc effectue des changements dans la mĂ©moire vers laquelle pointe stack (ce sont des changements nĂ©cessaires pour positionner correctement la pile pour lâenfant) avant de recourir Ă lâappel systĂšme clone (). DĂšs lors, lorsque clone () est utilisĂ© pour crĂ©er des enfants de maniĂšre rĂ©cursive, nâutilisez pas le tampon servant Ă la pile du parent en tant que pile de lâenfant.
Sur i386, clone () ne devrait pas ĂȘtre appelĂ© Ă lâaide de vsyscall, mais directement en utilisant int $0x80 .
Différences entre bibliothÚque C et noyau
Lâappel systĂšme clone brut ressemble plus Ă fork (2), en ceci que lâexĂ©cution dans le processus enfant continue Ă partir du point dâappel. Ă ce titre, les arguments fn et arg de la fonction enveloppe de clone () sont omis.
Contrairement Ă lâenveloppe de la glibc, lâappel systĂšme brut clone () accepte NULL en paramĂštre de stack (et de mĂȘme, clone3 () permet Ă cl_args.stack dâĂȘtre NULL). Dans ce cas lâenfant utilise une copie de la pile du parent (la sĂ©mantique de copie-en-Ă©criture assure que lâenfant recevra une copie indĂ©pendante des pages de la pile dĂšs quâun des deux processus la modifiera). Pour que cela fonctionne, il faut naturellement que CLONE_VM ne soit pas prĂ©sent (si lâenfant partage la mĂ©moire du parent du fait dâune utilisation de CLONE_VM , aucune duplication Ă lâaide de la copie-en-Ă©criture ne se produit et il peut sâensuivre probablement un grand chaos).
Lâordre des paramĂštres change aussi dans lâappel systĂšme brut et des variations existent dans les paramĂštres en fonction des architectures, comme indiquĂ© dans les paragraphes suivants.
Lâinterface de lâappel systĂšme brut sur des architectures x86-64 et quelques autres (dont sh, tile et alpha), est :
long
clone(unsigned long
flags
, void
*
stack
,
int *
parent_tid
, int *
child_tid
,
unsigned long
tls
);
Sur x86-32 et dâautres architectures classiques (dont score, ARM, ARM 64, PA-RISC, arc, Power PC, xtensa et MIPS), lâordre des deux derniers paramĂštres est inversé :
long
clone(unsigned long
flags
, void
*
stack
,
int *
parent_tid
, unsigned long
tls
,
int *
child_tid
);
Sur les architectures cris et s390, lâordre des deux premiers paramĂštres est inversé :
long
clone(void *
stack
, unsigned long
flags
,
int *
parent_tid
, int *
child_tid
,
unsigned long
tls
);
Sur lâarchitecture microblaze, il existe un paramĂštre supplĂ©mentaire :
long
clone(unsigned long
flags
, void
*
stack
,
int
stack_size
,
/* Taille de la pile */
int *
parent_tid
, int *
child_tid
,
unsigned long
tls
);
blackfin, m68k, et sparc
Les conventions de passage des arguments sur blackfin, m68k et sparc sont différentes de celles décrites précédemment. Pour plus de détails, se référer aux sources du noyau (et de la glibc).
ia64
Sur ia64, une interface différente est utilisée :
int
__clone2(int (*
fn
)(void *),
void *
stack_base
, size_t
stack_size
,
int
flags
, void *
arg
, ...
/* pid_t *
parent_tid
, struct user_desc
*
tls
,
pid_t *
child_tid
*/ );
Le prototype prĂ©sentĂ© ci-dessus vaut pour la fonction enveloppe de la glibc ; pour lâappel systĂšme lui-mĂȘme, il peut ĂȘtre dĂ©crit comme suit (il est identique au prototype clone () sur microblaze) :
long
clone2(unsigned long
flags
, void
*
stack_base
,
int
stack_size
,
/* Taille de la pile */
int *
parent_tid
, int *
child_tid
,
unsigned long
tls
);
__clone2 () fonctionne comme clone (), sauf que stack_base pointe sur la plus petite adresse de la pile de lâenfant et que stack_size indique la taille de la pile sur laquelle pointe stack_base .
STANDARDS
Linux.
HISTORIQUE
clone3 ()
Linux 5.3.
Linux 2.4 et antérieurs
Dans les sĂ©ries 2.4.x de Linux, CLONE_THREAD ne fait en gĂ©nĂ©ral pas du processus parent du nouveau thread un processus identique au parent du processus appelant. Cependant, de Linux 2.4.7 Ă Linux 2.4.18, lâattribut CLONE_THREAD impliquait CLONE_PARENT (de mĂȘme que dans Linux 2.6.0 et supĂ©rieurs).
Sous Linux 2.4 et plus anciens, clone () ne prend pas les paramÚtres parent_tid , tls , et child_tid .
NOTES
Une utilisation de ces appels systĂšme consiste Ă implĂ©menter des threads : un programme est scindĂ© en plusieurs lignes de contrĂŽle, sâexĂ©cutant simultanĂ©ment dans un espace mĂ©moire partagĂ©e.
Lâappel systĂšme kcmp (2) peut ĂȘtre utilisĂ© pour vĂ©rifier si deux processus partagent des ressources, telles quâune table de descripteurs de fichier, des opĂ©rations Annuler le sĂ©maphore sur System V, ou un espace dâadressage virtuel.
Les gestionnaires enregistrés en utilisant pthread_atfork (3) ne sont pas exécutés pendant un appel clone.
BOGUES
Les versions de la bibliothĂšque C GNU jusquâĂ la 2.24 comprise contenaient une fonction enveloppe pour getpid (2) qui effectuait un cache des PID. Ce cache nĂ©cessitait une prise en charge par lâenveloppe de clone () de la glibc, mais des limites dans lâimplĂ©mentation faisaient que le cache pouvait ne pas ĂȘtre Ă jour sous certaines circonstances. En particulier, si un signal Ă©tait distribuĂ© Ă un enfant juste aprĂšs lâappel Ă clone (), alors un appel Ă getpid (2) dans le gestionnaire de signaux du signal pouvait renvoyer le PID du processus appelant (le parent), si lâenveloppe de clone nâavait toujours pas eu le temps de mettre le cache de PID Ă jour pour lâenfant. (Ce point ignore le cas oĂč lâenfant a Ă©tĂ© créé en utilisant CLONE_THREAD , quand getpid (2) doit renvoyer la mĂȘme valeur pour lâenfant et pour le processus qui a appelĂ© clone (), puisque lâappelant et lâenfant se trouvent dans le mĂȘme groupe de threads. Ce problĂšme de cache nâapparaĂźt pas non plus si le paramĂštre flags contient CLONE_VM .) Pour obtenir la vĂ©ritable valeur, il peut ĂȘtre nĂ©cessaire dâutiliser quelque chose comme ceci :
#include
<syscall.h>
pid_t mypid;
mypid = syscall(SYS_getpid);
Suite Ă un problĂšme de cache ancien, ainsi quâĂ dâautres problĂšmes traitĂ©s dans getpid (2), la fonctionnalitĂ© de mise en cache du PID a Ă©tĂ© supprimĂ©e de la glibc 2.25.
EXEMPLES
Le programme suivant dĂ©crit lâusage de clone () dans le but de crĂ©er un processus enfant qui sâexĂ©cute dans un espace de noms UTS distinct. Le processus enfant change le nom dâhĂŽte (hostname) dans son propre espace UTS. Les processus parent et enfant affichent chacun le nom dâhĂŽte qui leur correspond, permettant ainsi de constater la diffĂ©rence des noms dâhĂŽtes dans leurs espaces de noms UTS respectifs. Pour un exemple dâutilisation de ce programme, consultez setns (2).
Dans le programme dâexemple, nous allouons la mĂ©moire qui doit ĂȘtre utilisĂ©e pour la pile de lâenfant en utilisant mmap (2) au lieu de malloc (3) pour les raisons suivantes :
|
- |
mmap (2) alloue un bloc de mĂ©moire commençant Ă la limite dâune page et qui est un multiple de la taille de la page. Cela est utile si on veut Ă©tablir une page de protection (avec PROT_NONE ) Ă la fin de la pile en utilisant mprotect (2). |
||
|
- |
On peut indiquer lâattribut MAP_STACK pour demander une association adaptĂ©e Ă une pile. Pour le moment, cet attribut nâest pas opĂ©rationnel sur Linux, mais il existe et a des effets sur dâautres systĂšmes, donc on doit lâinclure pour la portabilitĂ©. |
Source du programme
#define
_GNU_SOURCE
#include <err.h>
#include <sched.h>
#include <signal.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/utsname.h>
#include <sys/wait.h>
#include <unistd.h>
static int /* Commencer la fonction pour lâenfant
cloné */
childFunc(void *arg)
{
struct utsname uts;
/* Modifier le nom dâhĂŽte dans lâespace de
noms UTS de lâenfant. */
if (sethostname(arg, strlen(arg)) == -1)
err(EXIT_FAILURE, "sethostname");
/* Récupérer et afficher le nom
dâhĂŽte. */
if (uname(&uts) == -1)
err(EXIT_FAILURE, "uname");
printf("uts.nodename dans lâenfant : %s\n",
uts.nodename);
/* Rester en sommeil (fonction sleep) pour conserver
lâespace
de noms ouvert pendant un moment. Cela permet de
réaliser
quelques expĂ©rimentations â par exemple, un
autre processus
pourrait rejoindre lâespace de noms. */
sleep(200);
return 0; /* Le processus enfant se termine Ă ce
moment */
}
#define STACK_SIZE (1024 * 1024) /* Taille de la pile pour
lâenfant clonĂ© */
int
main(int argc, char *argv[])
{
char *stack; /* Début du tampon de la pile */
char *stackTop; /* Fin du tampon de la pile */
pid_t pid;
struct utsname uts;
if (argc < 2) {
fprintf(stderr, "Utilisation : %s
<nom_d_hĂŽte-enfant>\n", argv[0]);
exit(EXIT_SUCCESS);
}
/* Allouer la mémoire à utiliser pour la pile
du processus enfant. */
stack = mmap(NULL, STACK_SIZE, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK, -1, 0);
if (stack == MAP_FAILED)
err(EXIT_FAILURE, "mmap");
stackTop = stack + STACK_SIZE; /* On suppose que la pile
grandit vers
le bas */
/* Créer un processus enfant disposant de son propre
espace de noms UTS ; le processus enfant débute
son exécution dans childFunc(). */
pid = clone(childFunc, stackTop, CLONE_NEWUTS | SIGCHLD,
argv[1]);
if (pid == -1)
err(EXIT_FAILURE, "clone");
printf("clone() a renvoyé %jd\n",
(intmax_t) pid);
/* Le parent se retrouve ici */
sleep(1); /* Laisser le temps au processus enfant de
changer son nom dâhĂŽte */
/* Afficher le nom dâhĂŽte pour lâespace de
noms UTS du processus parent.
Celui-ci sera diffĂ©rent du nom dâhĂŽte
pour lâespace de noms UTS du
processus enfant. */
if (uname(&uts) == -1)
err(EXIT_FAILURE, "uname");
printf("uts.nodename dans le parent : %s\n",
uts.nodename);
if (waitpid(pid, NULL, 0) == -1) /* Attendre le processus
enfant */
err(EXIT_FAILURE, "waitpid");
printf("Fin du processus enfant\n");
exit(EXIT_SUCCESS);
}
VOIR AUSSI
fork (2), futex (2), getpid (2), gettid (2), kcmp (2), mmap (2), pidfd_open (2), set_thread_area (2), set_tid_address (2), setns (2), tkill (2), unshare (2), wait (2), capabilities (7), namespaces (7), pthreads (7)
TRADUCTION
La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org>, Cédric Boutillier <cedric.boutillier@gmail.com>, Frédéric Hantrais <fhantrais@gmail.com> et Jean-Philippe MENGUAL <jpmengual@debian.org>
Cette traduction est une documentation libre ; veuillez vous reporter Ă la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il nây a aucune RESPONSABILITĂ LĂGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .