#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.youkuaiyun.com/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.youkuaiyun.com/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参数所表示的调度策略来使用。
进程控制操作相关的函数
最新推荐文章于 2023-03-20 14:15:20 发布