fork()
fork()是Linux系统中创建子进程的最基本方式,它会复制当前进程,生成一个新的子进程,在fork()执行后,父进程和子进程都会暂停,直到子进程调用exec()或_exit()函数或者父进程调用wait()或waitpid()函数为止。
fork()函数原型如下:
include <unistd.h> pid_t fork(void);
fork()函数返回值有两种情况:
1、如果返回值为负数,表示创建子进程失败;
2、如果返回值为正数,表示当前进程是父进程,返回值为子进程的进程ID;如果返回值为0,表示当前进程是子进程。
在父进程中,可以通过判断fork()的返回值来区分父子进程,从而实现不同的功能,在子进程中,可以使用与父进程相同的文件描述符,避免资源浪费。
vfork()
vfork()是fork()的一种变体,它主要用于创建一个不会立即执行的子进程,当调用vfork()时,系统会先复制当前进程的代码和数据到堆栈中,然后再复制一份给子进程,这样可以避免子进程立即执行,从而提高性能。
vfork()函数原型如下:
include <unistd.h> pid_t vfork(void);
vfork()函数返回值也有两种情况:
1、如果返回值为负数,表示创建子进程失败;
2、如果返回值为0,表示当前进程是子进程;如果返回值大于0,表示当前进程是父进程。
与fork()类似,在父进程和子进程中都可以使用vfork()来实现不同的功能,需要注意的是,vfork()创建的子进程不会自动调用exec()或_exit()函数,因此需要手动调用,vfork()创建的子进程会继承父进程的信号处理函数,这可能会导致一些问题,因此在使用vfork()时需要注意信号处理的兼容性问题。
clone()
clone()是Linux系统中一种更高级的创建子进程的方式,它可以实现多任务并发和进程间通信等功能,clone()函数原型如下:
include <unistd.h>
include <sys/types.h>
include <sys/wait.h>
include <sys/resource.h>
include <signal.h>
include <fcntl.h>
include <ucontext.h>
include <sys/user.h>
include <sys/ptrace.h>
include <sys/prctl.h>
include <linux/sched.h>
include <sys/mman.h>
include <sys/ioctl.h>
include <sys/stat.h>
include <sys/socket.h>
include <netinet/in.h>
include <arpa/inet.h>
include <netdb.h>
include <time.h>
include <string.h>
include <stdlib.h>
include <locale.h>
include <limits.h>
include <dirent.h>
include <pwd.h>
include <grp.h>
include <attr/xattr.h>
include <attr/security.h>
include <attr/termios.h>
include <attr/sigaction.h>
include <attr/files.h>
include <attr/namespaces.h>
include <attr/capability.h>
include <attr/inode.h>
include <attr/fstab.h>
include <attr/mount.h>
include <attr/cpuset.h>
include <attr/personality.h>
include <attr/security/credentials.h>
include <attr/security/label.h>
include <attr/selinux/label.h> /for SELinux */ /* not supported in kernel 3.2 and below */ /* see also setproctitle(3) man page */ /* use setproctitle_common(3) if you are using kernel older than 3.2 */ /* or use setproctitle(3) with --unsafe-path=/bin */ /* use setproctitle(3) with --unsafe-path=/sbin */ /* to allow setting the process title without root privileges */ /* use setproctitle(3) with --real-root-uid=<uid> and --real-root-gid=<gid> to allow setting the process title without root privileges */ /* use setproctitle(3) with --unsafe-path=/sbin */ /* to allow setting the process title without root privileges */ /* use setproctitle(3) with --real-root-uid=<uid> and --real-root-gid=<gid> to allow setting the process title without root privileges */ /* use setproctitle(3) with --unsafe-path=/sbin */ /* to allow setting the process title without root privileges */ int clone(void *stack, size_t stacksize, void *arg, int flags, struct user_namespace *user_ns, unsigned long clone_flags);* char *getcwd(char *buf, size_t size);* int chdir(const char *path);* int gethostname(char *name, size_t len);* int sethostname(const char *name, size_t len);* int getdomainname(char *name, size_t len);* int setdomainname(const char *name, size_t len);* int getgroups(gid_t group[], size_t gsize, int *num_groups);* int setgroups(gid_t grouplist[], int ngroups);* int getpgid(pid_t pid);* int setsid();* int getppid();* int kill(pid_t pid, int signum);* int pipe(int flags);* int dup2(int oldfd, int newfd);* int open(const char *pathname, int flags);* int close(int fd);* int fcntl(int fd, int cmd, ... /* arg */);* int flock(int fd, int operation);* int lockf(int fd, int cmd, off_t len);* int read(int fd, void *ptr, size_t count);* int write(int fd, const void *ptr, size_t count);* int readlink(const char *pathname, char *buf, size_t bufsiz);* int access(const char *pathname, int mode);* int stat(const char *pathname, struct stat *buf);* int lstat(const char *pathname, struct stat *buf);* int unlink(const char *pathname);* int link(const char *oldpath, const char *newpath);* mode_t umask(mode_t mask);* dev_t makedev(unsigned short type, unsigned short major, unsigned short minor);* int chmod(const char *filename, mode_t mode);* int fchmodat(int dfd, const char *filename, mode_t mode_type);* intchown(const char *filename, uid_t owner, gid_t group);* int fchown(int fd, uid_t owner, gid_t group);* int fchownat(int dfd, const char *filename, uid_t owner, gid_t group, int flag);* int lchown(const char *filename, uid_t owner, gid_t group);* int lchownN (const char __user *username, uid_t owner, gid_t group);* int chcon(const char *pathname, const char *type);* int lchcon(const char __user *pathname, const char __user *type);* int systemd-run-system(const char ... /* string */)*;* void systemd-daemon-reload();* void systemd-daemon-stop();* void systemd-daemon-restart();* void systemd-daemon-enable();* void systemd-daemon-disable();* void systemd-daemon-status();* void systemd-daemon-sockets(* filenames ...)*;* void systemd-daemon-show(* unit ... *)*(注意这些函数并非所有平台都支持)
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/193322.html