在Linux中shell命令中 ps查看几个进程;ps -aux每一进程详细信息 | ||||
获取进程ID | #include<sys/types.h> | pid_t getpid(void) | pid_t 非负整数,0表示调度进程 | |
派生子进程 | #include<sys/types.h> | pid_t fork(void) | 出错-1(进程数上限,或系统内存不足) | |
派生子线程 | #include<sys/types.h> | pid_t vfork(void) | 出错-1(进程数上限,或系统内存不足) | |
exec函数族 | #include <unistd.h> | int execl(const char *path, const char *arg, ...); | p:file可执行文件名 | const char*arg :"ls","-l"……NULL |
#include<stdio.h> | void perror(const char*s) | |||
#include<stdio.h> | void exit(int status) | 保证数据完整性 | ||
0进程正常结束,其他非正常 | #include<unistd.h> | void _exit(int status) | 缓冲区数据丢失 | |
#include<sys/types.h> | pid_t wait(int*status) | |||
#include<sys/types.h> | pid_t waitpid(pid_t pid,int*status,int options) | pid>0等待子进程ID=pid | ||
#include<sys/types.h> | pid_t wait3(int*status,int oprions,struct rusage*rusage) | |||
成功返回进程ID | #include<sys/types.h> | pid_t wait4(pid_t pid,int *status,int options,struct rusage*rusage) | ||
用户ID 组ID | #include<sys/types.h> | uid_t getuid(void)//实际用户标识符 | ||
成功0失败-1 | #include<sys/tupes.h> | int setuid(uid_t uid)//超-实校设,普-效 | ||
成功0失败-1 | #include<sys/tupes.h> | int setreuid(uid_t ruid,uid_t euid)//实际有效用户交换 | ||
成功0失败-1 | #include<sys/tupes.h> | int seteuid(uid_t euid) | ||
system函数可用返回非零,不可用返回0 | #include<stdlib.h> | int system(const char*smdstring) | system和exec都可以执行进程外的命令,system是在原进程上开辟了一个新的进程,但是exec是用新进程(命令)覆盖了原有的进程。system和exec都有能产生返回值,system的返回值并不影响原有进程,但是exec的返回值影响了原进程。 | |
进程组 | #include<sys/types.h> | pid_t getpgrp(void)//进程组ID=进程组长ID | ||
#include<sys/types.h> | int setpgid(pid_t pid,pid_t pgid) | 参加或设置进程的组ID;两参数一样,更为进程组长 | ||
出错 | #include<errno.h> | errno Linux下宏定义常量。LinuxCAPI函数异常会赋整数值 | ||
会话期:多个进程组的集合,只有一个前台进程组 | #include<sys/types.h> | pid_t setsid(void)//成功ID错误-1 | 建立对话期。 | |
控制终端 | #include<sys/types.h> | pid_t tcgetpgrp(int fd) | 成功获得前台进程组ID,失败-1 | |
#include<sys/types.h> | int tcsetpgrp(int fd,pid_t pgrpid) | 置某一进程组为前台进程组,成功返回0,失败-1 | ||
信号 | #include<signal.h> | abort()//调用函数产生夭折信号SIGABRT | ||
alarm()//超过设置时间产生SIGALRM | ||||
kill -l 查看信号列表man 7 signal 查看详情 | ||||
#include<setimp.h> | int setjmp(jmp_buf envbuf) | envbuf缓冲区,博阿村系统堆栈内容 | ||
#include<setimp.h> | void longjmp(imp_buf envbuf,int val) | val 来自setjmp返回值 | ||
信号处理函数 | #include<signal.h> | void(*signal(int signum,void (*handler)(int)))(int) | 注册某个特定信号的处理程序成功返回以前处理配置,出错SIG_ERR | POSIX定义 |
成功0失败-1 | #include<signal.h> | int sigaction(int signum,const struct sigaction*act,struct sigaction*oldact) | 注册函数(多个信号阻塞注册函数) | |
struct sigaction{ | ||||
void(*sa_handler)(int); | 老类型的信号处理函数 | |||
void(*sa_sigaction)(int,siginfo_t*,void); | 新类型的信号处理函数 | 传入信号,信号相关信息,保留 | ||
sigset_t sa_mask; | 将要被阻塞的信号集合 | |||
int sa_flags; | 信号处理方式掩码 | |||
void(*sa_restorer)(void); | 保留不使用 | |||
} | ||||
信号集 | #include<signal.h> | int sigemptyset(sigset_t *set) | ||
int sigfillset(sigset_t*set) | 包含所有信号 | |||
int sigaddset(sigset_t*set,int signum) | ||||
成功0出错-1 | int sigdelset(sigset_t *set,int signum) | |||
真1假0 | intsigismenber(const sigset_t*set,int signum) | 是否包含signum信号 | ||
信号发送函数 | #include<sys/types.h> | int kill(pid_t pid,int signum) | 成功0出错-1 | |
成功0出错-1 | #include<sys/types.h> | int raise(int signum) | 向进程自己发信号值 | |
成功0出错-1 | #include<signal.h> | int sigqueue(pid_t pid ,int signum,const union sigval val) | 只能是一个进程发送信号 | |
typedef union sigval{ | ||||
int sival_int; | ||||
void *sival_ptr; | 指向要传递的信号参数 | |||
}sigval_t; | ||||
#include<unistd.h> | unsigned int alarm(unsigned int seconds) | 若进程已设闹钟返回上个剩余时间否则返回0 | 到时间调用SIFALRM的注册函数 | |
时钟处理 | #include<sys/time.h> | int setitimer(int which,const struct itimerval*value,struct itimerval*oldvalue) | which定时器类型 | value设置为计时器当前值。oldvalueNULL返回计时器原有值 |
int getitimer(int which,struct itimerval*value) | ||||
struct itimerval | ||||
{struct timeval it_interval; | 计时器重启动间歇值 | |||
struct timerval it_value;}; | 计时器安装后首先启动初始值 | |||
struct timeval | ||||
{long tv_sec; | 时间秒数部分 | |||
long tv_usec;}; | 时间微妙部分1/1000000 | |||
#include<stdlib.h> | void abort(void) | SIGABORT | ||
信号阻塞 | #include<signal.h> | int sigprocmask(int how,const sigset_t*set,sigset_t*oldset) | 全程阻塞/屏蔽信号 | set信号集、当前信号掩码 |
#include<signal.h> | int sigsuspend(const sigset_t *sigmask) | 进程挂起,等待放行信号 | ||
睡眠函数 | #include<unistd.h> | usigned int sleep(unsigned int seconds)//进程睡眠seconds秒 | 内部由alarm()和pause()实现,最好不混用 | |
进程间通信 | ||||
管道(匿名管道)内存 | #include<unistd.h> | int pipe(int fd[2]) //成功0出错-1 | fd[0]发送端fd[1]接收端 关闭用close(); | fork()成功,子进程可继承管道 |
命名管道(FIFO)文件系统 | #include<sys/types.h> | int mkfifo(const char*pathname,mode_t mode)//成功0出错-1 | ||
共享内存 | #include<sys/shm.h> | struct shmid_ds{//不同系统不一样,系统手册 | ||
创建打开共享内存 | #include<sys/types.h> | int shmget(key_t key,int size,int flag)//成功返回ID,出错-1 | ||
附加(要使用附加地址空间) | #include<sys/types.h> | void *shmat(int shmid,const void *addr,int flag) | ||
分离(进程脱离共享内存,不删除共享内存 | #include<sys/types.h> | int shmdt(void*addr) | ||
共享内存控制 | #include<sys/types.h> | int shmctl(int shmid,int cmd,struct shmid_ds *buf) | ||
操纵函数 | ||||
创建线程 | ||||
int pthread_attr_init (pthread_attr_t* attr);//对线程属性变量的初始化.成功: 0 失败: -1 | ||||
int pthread_attr_setscope (pthread_attr_t* attr, int scope);//attr属性。成功0失败 -1 | ||||
int pthread_attr_setdetachstate (pthread_attr_t* attr, int detachstate);//attr属性。成功0失败 -1 | ||||
int pthread_attr_setschedparam (pthread_attr_t* attr, struct sched_param* param);//线程优先级. | ||||
int pthread_attr_getschedparam (pthread_attr_t* attr, struct sched_param* param);//成功0失败 -1 | ||||
int pthread_attr_destroy(pthread_attr_t *attr);//删除线程的属性 | ||||
#include <pthread.h> | int pthread_create(pthread_t *restrict thread,//线程ID | 信号处理函数的控制流程只是在信号递达时产生,在处理完信号之后就结束,而多线程的控制流程可以长期并存,操作系统会在各线程之间调度和切换,就像在多个进程之间调度和切换一样 | ||
int pthread_kill(pthread_t thread, int sig);//向某个线程传递信号.thread要有signal处理函数 | ||||
int pthread_cancel(pthread_t thread) | ||||
void pthread_exit(void *value_ptr)//终止当前线程 | ||||
| int pthread_join(pthread_t thread, void **value_ptr);//线程挂起直到thread线程终止;成功返回0,失败返回错误号 | |||
| int pthread_detach(pthread_t thread);//成功返回0,失败返回错误号 | 主线程并不希望因为调用pthread_join而阻塞(因为还要继续处理之后到来的),这时可以在子线程中加入代码 | ||
互斥锁 | #include <pthread.h> | pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;//宏,静态初始化 | ||
int pthread_mutex_destroy(pthread_mutex_t *mutex);//释放它所占用的资源,在Linux互斥锁并不占用任何资源,除了检查锁状态以外(锁定状态则返回EBUSY)没有其他动作 | ||||
锁操作 | int pthread_mutex_lock(pthread_mutex_t *mutex)//加锁 | |||
通用套接口地址数据结构 | #include<sys/socket.h> | struct sockaddr{ | ||
unit8_t sa_len; | ||||
sa_family_t sa_family;//协议族 AF_XXX | ||||
char sa_data[14];};//14字节协议地址 | ||||
IPV4套接接口地址数据结构 | <netinet/in.h> | struct sockaddr_in{ | ||
unit8_t sin_len;//不用设置 | ||||
sa_family_t sin_family;//协议族 AF_INET | ||||
in_port_t sin_port;//16位TCP或UDP端口号,网络字节序 (大端模式) | ||||
struct in_addr sin_addr;//32位IPv4,网络字节序 | struct in_addr{ | |||
unsigned char sin_zero[8];};//未用0 | in_addr_t s_addr;}; | |||
字节排序函数 | #include <arpa/inet.h> | uint32_t htonl(uint32_t hostlong);本地long转网络long | ||
uint16_t htons(uint16_t hostshort);返回网络字节序 | ||||
uint32_t ntohl(uint32_t netlong); | ||||
uint16_t ntohs(uint16_t netshort);返回主机字节序 | ||||
h-host n-newwork s-short l-long | ||||
字节操纵函数 | #include<string.h> | void bzero(void*dest,size_t nbytes)//将地址dest开始nbytes置0 | ||
void bcopy(const void *ptr1,const void *ptr2,size_t nbytes)//复制内存数据 | ||||
int bcmp(const void*ptr1,const void*ptr2,size_t nbytes)//比较内存数据大小 | ||||
void memset(void *dest,int c,size_t len)//把dest中len设置为c | ||||
void memcpy(void *dest,const void*src,size_t nbytes);//复制内存数据 | ||||
int memcmp(const void*ptr1,const void *ptr2,size_t nbytes)//比较内存数据大小 | ||||
IP地址转换函数 | #include <arpa/inet.h> | int inet_aton(const char *strptr, struct in_addr *addrptr);成功1失败0,结果在addrptr | ||
in_addr_t inet_addr(const char *strptr);//成功返回32位二进制网络字节序地址,出错INADDR_NONE | ||||
int inet_pton(int family, const char *strptr, void *addrptr);//字符串-》in_addr | ||||
char *inet_ntoa(struct in_addr inaddr);//成功返回十进制数串指针,失败NULL | ||||
const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len);//in_addr-》字符串 | ||||
IP和域名转换 | #include<netdb.h> | struct hostent *gethostbyname(const char*hostname)域名-》IP地址 | ||
struct hostent*gethostbyaddr(const char*addr,size_t len,int family)IP地址-》域名;ipv4 的len4;IPv6len16 | ||||
若失败返回NULL,并设全局变量h_errno;h_streeror获取详细出错信息 | ||||
HOST_NOT_FOUND找不到主机 | ||||
TRY_AGAIN出错重试 | ||||
NO_RECOVERY不可修复性错误 | ||||
NO_DATA指定的名字有效但没有定义 | ||||
struct hostent{ | ||||
char*h_name;//主机正式名称 | ||||
char*h_aliases;//主机别名 | ||||
int h_addrtype;//IPV4为 AF_INET | ||||
int h_length;//Ipv4为4字节 | ||||
char**h_addr_list;};//IP地址列表 | ||||
#define h_addr h_addr_list[0]//主机第一个IP地址 | ||||
创建套接口socket | #include<sys/types.h> | int socket(int family,int type,int potocol);//成功返回套接口描述符,失败-1 | ||
不能用open()访问sockfs文件 | fimaly: | |||
type | ||||
绑定端口 | int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen);//成功0失败-1 | |||
等待监听函数 | int listen(int sockfd, int backlog);//成功0,失败-1 | |||
接受连接函数 | #include<sys/types.h> | int accept(int sockfd,struct sockaddr*addr,socketlen_t*addrlen) | ||
请求链接函数 | #include<sys/types.h> | int connect(int sockfd,const struct sockaddr*serv_addr,int addrlen) | ||
数据发送函数 | #include<sys/types.h> | int send(int sockfd,const void*msg,int len,unsigned int flags) | ||
数据接受函数 | #include<sys/types.h> | int recv(int sockfd,void *buf,int len usigned int flags) | ||
文件读写 | #include<unistd.h> | ssize_t read(int sockfd,void *buf,size_t count)//出错-1,否则返回读入的字节数 | fd文件描述符;buf指针缓冲区;count要读取的字节数 | |
#include<unistd.h> | ssize_t write(int sockfd,void *buf,size_t count)//出错-1,否则返回成功发送的字节数 | fd文件描述符;buf指针缓冲区;count要写入取的字节数 | ||
关闭socket | close(socketId); | |||
| typedef struct | |||
| fd_set类四个宏来操作: | |||
#include <sys/time.h> | int select(int nfds, fd_set *readset, fd_set *writeset,fd_set* exceptset, struct tim *timeout);//测试指定的fd待处理?可读/可写/有异常条件 | select函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,系统提供select函数来实现多路复用输入/输出模型 |
Linux下进程控制函数
原创
©著作权归作者所有:来自51CTO博客作者datrilla的原创作品,请联系作者获取转载授权,否则将追究法律责任
上一篇:Linux下简单gcc
下一篇:Linux下指针NULL_0x0
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
linux下的 进程控制 以及常见的进程控制函数
基于linux的 进程控制 以及常见的进程控制函数
进程 进程控制 控制函数 -
[ Linux ] 进程控制
Linux 进程控制 看完可简易实现一个shell
进程控制 进程等待 进程替换 -
[ Linux ] 进程控制(下)----进程等待与进程程序替换
本小节继续承接上文进程控制继续对进程控制中的进程等待和进
linux 运维 服务器 子进程 #include -
linux五 进程控制
分别为初始态,就绪态,运行态,挂起态与终止态。
linux 运维 服务器 子进程 父进程