赞
踩
在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> |
|
|
|
|
| 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函数来实现多路复用输入/输出模型 |
|
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。