C Linux Process API小结

Posted on 2014-12-10


《Linux程序设计》关于进程API小结。

#进程操作

#include <stdlib.h>

int 
system(
	const char *string
);

执行命令,等同于:

$ sh -c string
#include <unistd.h>

int
execl(
	const char *path,
	const char *arg0,
	...,
	(char *)0
);

int 
execlp(
	const char *file,
	const char *arg0,
	...,
	(char *)0
);

int 
execle(
	const char *path,
	const char *arg0,
	...,
	(char *)0,
	char *const envp[]
);

int 
execv(
	const char *path,
	char *const argv[]
);

int 
execvp(
	const char *file,
	const *const argv[]
);

int
execve(
	const char *path,
	char *const argv[],
	char *const envp[]
);

将当前进程替换为一个新进程

#include <sys/types.h>
#include <unistd.h>

pid_t fork(void);

复制进程映像, 常用语法:

pid_t new_pid;
new_pid = fork();

switch(new_pid) {
case -1: /* 错误 */
	break;
case 0 : /* 子进程 */
	break;
default: /* 父进程 */
	break;
}
#include <sys/types.h>
#include <sys/wait.h>

pid_t // 返回子进程PID
wait(
	int *stat_loc //如果非空指针,状态信息将被写入它所指向的位置
);

暂停父进程直到子进程结束为止

#include <sys/types.h>
#include <sys/wait.h>

pid_t 
waitpid(
	pid_t pid, // 指定进程PID
	int *stat_loc,
	int options // 常用WNOHANG,作用是防止waitpid调用将调用者的执行骨气
);

等待指定子进程的结束

信号

信号是UNIX和Linux系统响应某些条件而产生的一个事件。接收到该信号的进程会相应地采取一些行动。

#include <signal.h>

void 
(*signal(
	int sig, // 信号代码
	void (*func)(int) // 处理函数
))(int);

信号处理

#include <sys/types.h>
#include <signal.h>

int
kill(
	pid_t pid,
	int sig
);

发送信息

#include <unistd.h>

unsigned int 
alarm(
	unsigned int seconds
);

在seconds秒之后发送发送一个SIGALRM信号

#include <unistd.h>

int pause(void);

把进程挂起直到有一个信号出现为止

更加健壮的信号接口

#include <signal.h>

int 
sigaction(
	int sig,
	const struct sigaction *act,
	struct sigaction *oact
);

// sigaction至少包括以下介个成员
struct sigaction {
	void (*) (int)sa_handler, /* 函数指针, SIG_DEF 或者SIG_IGN  */
	sigset_t sa_mask, /* sa_handler屏蔽的信号集 */
	int sa_flags
};

接收并处理信号

信号集

#include <signal.h>

int 
sigaddset(
	sigset_t *set,
	int signo
);

向信号集中添加信号

int 
sigemptyset(
	sigset_t *set
);

将信号集初始化为空

int 
sigfillset(
	sigset_t *set
);

将信号集初始化为包含所有已定义的信号

int 
sigdelset(
	sigset_t *set, 
	int signo
); 

从信号集中删除信号

int sigismember(
	sigset_t *set,
	int signo
);

检查给定信号是否是一个信号集的成员

int 
sigpending(
	sigset_t *set
);

将被阻塞的信号中停留在待处理状态的一组信号写到参数set指向的信号集中

int
sigsuspend(
	const sigset_t *sigmask
);

将进程的屏蔽字替换为由参数sigmask给出的信号集,然后挂起程序的执行