#include<unistd.h> pid_t fork(void); pid_t vfork(void); 创建一个新的进程,如果返回值为正数,则执行的是父进程,该值为子进程的PID,如果返回值为0,则执行的是子进程,返回-1,创建出错。 在Linux操作系统上,vfork()同fork()一样,在其他系统中,略有区别。 int execve(const char *filename, char *const argv[], char *const envp[]); int execl( const char *path, const char *arg, ..., NULL); int execlp( const char *file, const char *arg, ..., NULL); int execle( const char *path, const char *arg , ...,NULL, char * const envp[]); int execv( const char *path, char *const argv[]); int execvp( const char *file, char *const argv[]); exec系列中的系统调用都完成相同的功能(只是参数不同而已),它们把一个新程序装入调用进程的内存空间,来改变调用进程的执行代码, 从而形成新进程。如果exec调用成功,调用进程将被覆盖,然后从新程序的入口开始执行,这样就产生了一个新的进程,但是它的进程标识符 与调用进程相同。这就是说,exec没有建立一个与调用进程并发的新进程,而是用新进程取代了原来的进程。所以,在exec调用成功后, 没有任何数据返回,这与fork()不同。 #include<stdlib.h> int system(const char *string); FILE *popen(const char *command, const char *type); int pclose(FILE *stream); popen()函数同system()函数类似,不同的是popen()函数会调用pipe为程序创建一个标准的输入或者输出管道,不能同时创建。 #include<sched.h> int __clone(int(*fn)(void *arg),void *child_stack,int flags ,void *arg); __clone函数同fork()函数作用一样,只不过__clone提供了更多的对父子进程共享的进程资源的控制。 第一个参数为子进程要执行的函数,第二个参数为指向分配给子进程的栈指针,第三个为标志,第四个为传递给子进程函数的参数指针。 具体讲解,可参见http://blog.csdn.net/caianye/archive/2010/10/17/5947282.aspx #include<sys/types.h> #include<sys/wait.h> pid_t wait(int *status); pid_t waitpid(pid_t pid, int *status, int options); #define _USE_BSD #include <sys/types.h> #include <sys/resource.h> #include <sys/wait.h> pid_t wait3(int *status, int options,struct rusage *rusage) pid_t wait4(pid_t pid, int *status, int options,struct rusage *rusage) wait()等待任意子进程结束,waitpid()等待由pid指向的子进程结束。遵循BSD风格的wait3()根wait4()同wait和waitpid一样。 但其还将子进程的资源使用返回到由rusage参数指针所指的结构中。 #include <signal.h> struct sigaction { void (*sa_handler)(int); sigset_t sa_mask; int sa_flags; void (*sa_restorer)(void); } void (*signal(int signum, void (*handler)(int)))(int); signal()函数为信号量signum注册处理函数。 int raise (int sig);raise()将信号量sig发送到当前进程。 int killpg(int pgrp, int sig);将信号量sig发送给由pgrp指定的进程组中所有的进程。当pgrp为0时,发送给当前进程的进程组。 int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);为signal更详尽的版本 int sigprocmask(int how, const sigset_t *set,sigset_t *oldset);设置当前被阻塞的信号的掩码 int sigpending(sigset_t *set);处于等待状态的信号 int sigsuspend(const sigset_t *mask);sigsuspend函数可以暂时将当前阻塞信号集改变为由sigmask指定的信号集。 改变后,sigsuspend会等待,直到一个信号被交付。一旦一个信号被交付后,原先的信号集被恢复。 由于sigsuspend调用在信号交付之后总是被终止,它的返回值总是-1,errno总是EINTR。 void psignal(int sig, const char *s);列出信号描述和指定字符串 #include <sys/types.h> #include <signal.h> int kill(pid_t pid, int sig);将信号sig发送给由pid指定的进程。 #include <unistd.h> int pause(void);让进程暂停直到信号出现 #include <string.h> char *strsignal(int sig);返回一个指向描述信号sig的字符指针。该描述字符串或许可以在sys_siglist[]数组中被直接访问。 extern const char * const sys_siglist[]; #include <unistd.h> void _exit(int status); #include <stdlib.h> void exit(int status); int atexit(void (*function)(void)); int on_exit(void (*function)(int , void *), void *arg); void abort(void);结束当前程序 #include <assert.h> void assert (int expression); 该宏计算表达式,如果为false(0)则调用abort,否则不执行。定义NDEBUG宏可以使assert失效。 在程序结束前,由atexit()或者on_exit()注册的退出处理函数都会被调用。exit()函数会调用系统_exit()函数。 atexit和on_exit函数,注册退出处理函数,前者的处理函数没有参数,没有返回值,后者有参数。两者注册成功则返回0,否则返回-1 #include <sys/time.h> struct itimerval { struct timeval it_interval; /* next value */ struct timeval it_value; /* current value */ }; struct timeval { long tv_sec;/* seconds */ long tv_usec;/* microseconds */ }; int getitimer(int which, struct itimerval *value); int setitimer(int which, const struct itimerval *value,struct itimerval *ovalue); 具体介绍参见:http://general.blog.51cto.com/927298/368548 #include <unistd.h> unsigned int alarm(unsigned int seconds);当seconds时间到后,发送一个SIGALRM信号 unsigned int sleep(unsigned int seconds); void usleep(unsigned long usec); sleep和usleep函数延迟进程执行至少seconds秒或者usec毫秒。实际的延迟可能会比预计的时间长一点。 #include <unistd.h> int nice(int inc);为调用nice的进程的动态优先级增加inc,降低其优先级。 #include <sys/time.h> #include <sys/resource.h> int getpriority(int which, int who);取得程序进程执行优先权 参见http://baike.baidu.com/view/1745433.htm int setpriority(int which, int who, int prio); setpriority()可用来设置进程、进程组和用户的进程执行优先权。参数which有三种数值,参数who 则依which值有不同定义 which who 代表的意义 PRIO_PROCESS who为进程识别码 PRIO_PGRP who 为进程的组识别码 PRIO_USER who为用户识别码 进程默认的优先权都为0,所以每个进程执行所占用的时间都差不多。为了使某个进程执行的时间更长一些,可以提高该进程的优先权。 参数prio介于-20 至20 之间。代表进程执行优先权,数值越低代表有较高的优先次序,执行会较频繁。此优先权默认是0,而只有超级用户(root)允许降低此值。 返回值 执行成功则返回0,如果有错误发生返回值则为-1,错误原因存于errno。 ESRCH 参数which或who 可能有错,而找不到符合的进程 EINVAL 参数which值错误。 EPERM 权限不够,无法完成设置 EACCES 一般用户无法降低优先权 可参见:http://blog.csdn.net/billpig/archive/2010/05/09/5571718.aspx #include <sched.h> int sched_get_priority_max(int policy); int sched_get_priority_min(int policy); 这两个函数分别返回最大的和最小的实时静态优先级的值,这个值由policy参数所表示的调度策略来使用。