进程函数:
int system(const char *string); 启动shell来运行string
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, const char *envp[]);
int execv(const char *path, const char *argv[]);
int execvp(const char *file, const char *argv[]);
int execve(const char *path, const char *argv[],const char *envp[]);
exec将用它运行的代码替换我们当前程序代码,没有错误将不返回
常用运行外部程序方式:
pid_t new_pid = fork();
switch (new_pid){
case -1:
exit(-1);
break;
case 0:
exec(...);
break;
default:
break;
}
进程等待:
pid_t wait(int *stat_loc); 一个子进程结束后返回其进程id.stat_loc为子进程退出状态
-----------------------------------------------------------------------------------------------------------------------
宏定义(sys/wait.h) 说明
-----------------------------------------------------------------------------------------------------------------------
WIFEXITED(stat_loc) 若正常退出, 取非0值
WEXITSTATUS(stat_loc) 若WIFEXITED非0,返回子进程退出码
WIFSIGNALED(stat_loc) 若因未捕获的信号终止,取非0值
WTERMSIG(stat_loc) 若WIFEXITED非0,返回信号代码
WIFSTOPPED(stat_loc) 若子进程停止,取非0值
WSTOPSIG(stat_loc) 若WIFSTOPPED非0,返回信号代码
---------------------------------------------------------------------------------------------------------------------------
pid_t waitpid(pid_t pid, int *stat_loc, int options);
pid为-1返回每个子进程的信息; options为WNOHANG调用者执行不挂起,此时返回0表示子进程未
结束,否则为其child_id,-1表示失败
信号
-----------------------------------------------------------------------------------------------------------------------------
信号名称 说明
-----------------------------------------------------------------------------------------------------------------------------
SIGABORT *进程停止运行
SIGALRM 警告钟
SIGFPE *浮点运算例外
SIGHUP 系统挂断
SIGILL *非法指令
SIGINT 终端中断
SIGKILL 停止进程(不能忽略或被俘获)
SIGPIPE 向无读者的管道写数据
SIGQUIT 终端退出
SIGSEGV *无效内存段访问
SIGTERM 终止
SIGUSR1 用户定义信号1
SIGUSR2 用户定义信号2
--------------------进程收到以上某信号而未事先安排捕获则立刻终止------------------------------------
SIGHLD 子进程已停止或退出(默认被屏蔽)
SIGCONT 若被停止则继续运行
--------------------以下信号使接收进程停止运行----------------------------------------------------------------
SIGSTOP 停止执行(不能忽略或被捕获)
SIGSTP 终端停止信号
SIGTTIN 后台进程请求读操作
SIGTTOU 后台进程请求写操作
-------------------------------------------------------------------------------------------------------------------------------
信号处理函数:
void (*signal(int sig, void(*func(int)))(int); 如signal(SIGINT, ouch); ouch为一个处理函数,
返回是此前处理此信号的函数指针.
发送信号:
int kill(pid_t pid, int sig); 普通用户只能向同用户进程发送信号.失败返回-1,errno=EINVAL
信号无效,EPERM权限不足,ESRCH指定进程不存在
闹钟信号
unsigned int alarm(unsigned int seconds); 每个进程一个alarm,重新调用重新计时,参数0取消已设置.
返回前一个闹钟还有多少时间发生信号.
int pause(void); 程序挂起直到收到信号
健壮的信号接口
int sigaction(int sig, const struct sigaction *act, struct sigaction *oact);
act为新的信号操作结构,oact为原来的,成功返回0.
sigaction 包括void (*)(int) sa_handler; sigset_t sa_mask; int sa_flags;等
sa_mask指定的信号将被堵塞
sa_flags为
SA_NOCLDSTOP 子进程停止时不产生SIGCHLD信号
SA_RESETHAND 对信号处理重置为SIG_DFL
SA_RESTART 重新启动中断函数而不是给出EINTR错误
SA_NODEFER 捕获时不把信号添加到信号掩码中
信号集:
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 sigprocmask(int how, const sigset_t *set, sigset_t *oset);
how = SIG_BLOCK / SIG_SETMASK / SIG_UNBLOCK
分别表示在掩码中添加,设置为或去掉set中定义的信号
查看阻塞的信号 int sigpending(sigset_t *set);
挂起进程至指定信号到达 int sigsuspend(const sigset_t *sigmask);
线程
创建新线程
#include <pthread.h>
int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *argv);
void pthread_exit(void *retval);
void pthread_join(pthread_t th, void **thread_return);
信号量
#include <semaphore.h>
int sem_init(sem_t *sem, int pshared, unsigned int value);
sem为指定的信号量, pshared表示进程局部或者进程共享信号量(0/1),value为初始值
int sem_wait(sem_t *sem); 减1操作 int sem_trywait(...)非阻塞模型
int sem_post(sem_t *sem); 加1操作
int sem_destroy(sem_t *sem);
互斥量
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr)
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
int pthread_mutex_destroy(pthread_mutex_t *mutex);