linux QT 结束当前进程_Linux应用层API整理大全(没有的赶紧收藏)

linux QT 结束当前进程_Linux应用层API整理大全(没有的赶紧收藏)_第1张图片

对于大部分嵌入式Linux应用开发来说,虽然大部分情况都是对数据(数据结果,应用逻辑,算法), 视图界面(QT/C++, Android/java)等的应用实现不过为了满足底层硬件的交互以及复杂应用的需求,对于线程(pthread), 进程(fork),定时器和signal,网络通讯(TCP、UDP),进程/线程同步(管道,FIFO,互斥量等),文件-设备I/O(open, write, read, close),Linux基本系统功能(mkdir, getenv, getopt)等API接口访问的使用某种程度是必不可少的作为从业者来说,我十分认可只是去记这些API意义并不大,但是对于这些API有一定的了解,掌握这些知识背后涉及的操作系统,网络相关的知识,是有重要意义的。

对于LinuxAPI接口的掌握,我主要学习资料为和, 以及搜索引擎中搜索的知识点,虽然已经有了比较丰富的开发经验,但直接从头开始学这两本还是感觉抓不住重点,不过结合应用开发的经历,在利用这两本去理解所用到的接口,才算有了比较迅速的认知,为了更进一步的加深印象,也为了方便后续使用过程中的查找,我将这些API进行了整理,并编写了简单的demo,目前所有代码和说明在如下链接。

  1. 1.base_api/ Linux基础API相关接口

//打开文件夹路径DIR *opendir (const char *__name);//读取路径信息struct dirent *readdir (DIR *__dirp);//关闭文件夹int closedir (DIR *__dirp);//创建文件夹int mkdir (const char *__path, __mode_t __mode);//获取进程ID__pid_t getpid (void);//获取组ID__uid_t getuid (void);//输出错误信息void perror (const char *__s);//获取当前时间信息time_t time (time_t *__timer);//根据解析值获取变量int getopt (int ___argc, char *const *___argv, const char *__shortopts)

2. fifo/ Linux命名先入先出管道通讯

用于Linux进程间通讯的命名先入先出管道

//用于创建fifo管道的应用实现int mkfifo (const char *__path, __mode_t __mode);//打开FIFO管道,获取后续使用的描述符int open(const char *pathname, int oflag,...);//从FIFO管道中读取数据ssize_t read(int fd, void * buf, size_t count);//向FIFO管道写入数据ssize_t write (int fd, const void * buf, size_t count);//关闭FIFO管道int close(int fd);//移除FIFO管道int unlink (const char *__name);

3. file_io/ Linux文件I/O操作

Linux中设备的访问也以一切皆文件的思想存在,所以文件I/O是最常用的接口。

//打开文件,获得文件描述符int open(const char *pathname, int oflag,...);//从文件中读取数据ssize_t read(int fd, void * buf, size_t count);//向文件中写入数据ssize_t write (int fd, const void * buf, size_t count);//关闭文件描述符int close(int fd);//移动文件指针偏移地址,和read配合使用从指定起始地址读取数据off_t lseek(int fildes, off_t offset, int whence);

4. fork/ 进程的创建和应用

Linux通过fork创建进程,复制资源

//系统调用创建和原进程资源一致的的新进程(会复制资源重新分配)__pid_t fork(void);//获得当前进程的pid值__pid_t getpid(void);//获得当前进程的父进程pid值__pid_t getppid(void);

5. msg_queue/ Linux进程间消息队列处理

对于任何满足权限的进程或线程,都允许从消息队列里读取和写入消息

//创建消息队列int msgget(key_t key, int oflg);//从消息队列里读取数据ssize_t msgrcv(int msqid, void *ptr, size_t length, long type, int flag);//创建一个新的消息队列或访问一个已存在的消息队列int msgsnd(int msqid, const void *ptr, size_t length, int flag);//提供在一个消息队列上的各种控制操作int msgctl(int msqid, int cmd, struct msqid_ds *buff);

6. pthread/ Linux多线程接口

多线程编译编译需要添加-lpthread

//线程的创建int pthread_create(pthread_t *tid, const pthread_arrt_t* attr,void*(*start_routine)(void *), void* arg);//等待线程的结束,非分离的线程在结束后只有执行join才会释放全部资源int pthread_join(pthread_t thread, void **retval);//线程离开时的返回值(必须为malloc或者全局变量)void pthread_exit(void * retval);//分离线程,被分离的线程在结束后自动释放所有资源int pthread_detach(pthread_t tid);//多线程的交互--互斥量和自旋锁
//互斥量pthread_mutex_t m_lock;
pthread_mutex_destroy(&m_lock);
thread_mutex_lock(&m_lock)
pthread_mutex_unlock(&m_lock);//自旋锁pthread_spinlock_t m_spinlock;
pthread_spin_destroy(&m_spinlock);
pthread_spin_lock(&m_spinlock);
pthread_spin_trylock(&m_spinlock);
pthread_spin_unlock(&m_spinlock);

7. pipe/ 用于进程间通讯的管道

//创建pipe通道, 其中fd[0]为数据读管道描述符,fd[1]为数据写管道描述符int pipe(int fd[2]);//通过管道描述符从管道中读取数据ssize_t read(int fd, void * buf, size_t count);//通过管道描述符向管道中写入数据ssize_t write (int fd, const void *buf, size_t count);//关闭通道的接口应用int close(int fd);

8. posix_mq/ 基于posix接口的消息队列

//删除已经存在的消息队列int mq_unlink(const char *name);//打开或者创建一个消息队列mqd_t mq_open(const char *name, int oflag, .../*mode_t mode, struct mq_attr *attr*/);//关闭消息队列int mq_close(mqd_t mqdes);//获取消息队列的具体参数信息int mq_getattr(mqd_t mqdes, struct mq_attr *attr);//投递数据给消息队列int mq_send(mqd_t mqdes, const char *ptr, size_t len, unsigned int prio);//等待消息队列有消息接收ssize_t mq_receive(mqd_t mqdes, const char *ptr, size_t len, unsigned int *prio);

9.system_env/ 系统环境变量访问

//获取系统环境变量char *getenv(const char *name);//添加和修改环境变量int setenv(const char *name, const char *value, int rewrite);//删除环境变量int unsetenv(const char *name);//写入环境变量,覆盖或者添加, 和setenv功能类似,实现上格式为name=stringchar *putenv(char *str);//执行调用其它程序或者指令int system (const char *__command);

10. tcp/ 用于TCP客户端和服务器的demo

//TCP客户端接口
//创建网络套接字int socket(int domain, int type, int protocol)//TCP握手连接到指定IP地址和端口int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);//向连接的服务器通过TCP发送数据ssize_t write(int fd, const void *buf, size_t count);//从连接的服务器读取TCP数据ssize_t read(int fd, void *buf, size_t count);//关闭Socke通讯int close(int fd);//TCP服务器接口
//在包含上述客户端接口外,额外需要服务器绑定的接口和等待连接的接口
//TCP服务器绑定到指定的IP地址和客户端int bind(int sockfd, const struct sockaddr* my_addr, socklen_t addrlen);//TCP等待客户端的连接int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

11. signal/ Linux软件定时器和信号触发

//用于连接信号和处理函数的实现sighandler_t signal(int signum, sighandler_t handler);//创建软件定时器的函数int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue));

12.time/ 系统时间处理的接口

//获取系统的日历时间,以1970-1-1, 00:00:00开始time_t time (time_t *__timer);//根据日历时间获取GMT时间的函数struct tm *gmtime (const time_t *__timer);struct tm *gmtime_r (const time_t *__restrict __timer,  struct tm *__restrict __tp)//获取本地时间的函数struct tm *localtime (const time_t *__timer);struct tm *localtime_r (const time_t *__restrict __timer, struct tm *__restrict __tp)//根据本地时间生成时间字符串char *asctime (const struct tm *__tp);char *asctime_r (const struct tm *__restrict __tp, char *__restrict __buf);//根据日历时间生成时间字符串char *ctime (const time_t *__timer);char *ctime_r (const time_t *__restrict __timer, char *__restrict __buf);//将带时区的时间转换成秒数time_t mktime (struct tm *__tp);

13. udp/ 用于UDP客户端和服务器的demo

//UDP客户端接口
//创建网络套接字int socket(int domain, int type, int protocol)//UDP数据发送ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);//UDP数据接收ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);//关闭Socket通讯int close(int fd);//UDP服务器接口
//在包含上述客户端接口外,额外需要服务器绑定的接口
//UDP服务器绑定到指定的IP地址和客户端int bind(int sockfd, const struct sockaddr* my_addr, socklen_t addrlen);

当然到这里也只是Linux API中很少的一部分,这部分我后续会努力持续更新,不过因为个人工作比较忙碌,更新可能不会特别迅速,另外无论上面的说明还是demo也只是单纯的应用,没有深入去讲述背后的原理和技术,并不是说这些不重要,而是如果深入讲解,那么上面每一节的内容都值得写一篇文章分享,但是这样就与我整理API的。

这些接口说明和应用demo在开发或者使用的时候可以帮助快速上手,但对于具体细节,建议配合上面我提到的两本书籍一起学习,遇到不理解的应用,在书本的内部都会有相应的说明(后续会在注释中补充相关的参考资料),另外,因为本人能力和精力问题,不能够覆盖大部分测试环境,理解也可能有偏差,如果遇到,可以积极反馈,毕竟只有解决了不足才会有进步。

进群领取《嵌入式Linux入门到精通视频教程》

(课程涵盖:入门班、进阶班、精讲班、深入班、项目班)

linux QT 结束当前进程_Linux应用层API整理大全(没有的赶紧收藏)_第2张图片

你可能感兴趣的:(linux,QT,结束当前进程)