Linux编程基础
介绍一些linux编程中的系统函数,以及这些函数涉及到的Linux原理和知识
handsome boy!
这个作者很懒,什么都没留下…
展开
-
解决c linux popen 只能获取stdout 无法获取 stderr
解决c linux popen 只能获取stdout 无法获取 stderr原创 2022-06-02 16:03:12 · 985 阅读 · 0 评论 -
linux signal()、sigaction()信号捕捉函数
signal()函数signal()函数不是标准的函数,不一定在每个版本的linux系统下都能正常工作,sigaction是标准的linux函数 typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler);signum参数signum是要捕捉...原创 2020-02-18 11:51:45 · 182 阅读 · 0 评论 -
linux 信号集概念及其相关函数讲解
概念:未决信号集:没有被当前进程处理的信号阻塞信号集:将某个信号放到阻塞信号集,这个信号就不会被处理了。一般是人为的。阻塞解除,信号就变成递达状态,然后被处理阻塞信号集和未决信号集存在于内核区的pcb中阻塞信号集和未决信号集、自定义信号集的关系信号被发送之后会先到达未决信号集,在处理之前要先查询阻塞信号的对应状态,如果为1,表示对应的未决信号应该阻塞,此时将不处理未决信号集。如果为0...原创 2020-02-18 09:20:33 · 371 阅读 · 0 评论 -
linux setitimer()函数详解
int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);参数解释:which参数 ITIMER_REAL自然定时法则,就和alarm中的一样;对应的信号为(SIGALRM) ITIMER_VIRTUAL只计算用户区代码运行的时间;对应的信号为(SIGVTA...原创 2020-02-17 21:39:19 · 424 阅读 · 0 评论 -
Linux 获取程序的正式运行时间、用户区运行时间、内核区运行时间,将输出结果重定向到文件
获取程序运行时间信息:在执行程序的时候前面加time,比如执行time ./a.out重定向输出内容./a.out >file原本打印到屏幕上,重定向后会输出在file中原创 2020-02-17 17:46:09 · 286 阅读 · 1 评论 -
linux alarm()函数
unsigned int alarm(usigned int seconds);alarm函数会在指定的时间过了以后向自己发送14号信号SIGALARM,会导致进程终止。但是可以捕捉信号做自己的操作alarm()函数返回上一个alarm()剩下的时间;...原创 2020-02-17 17:34:58 · 166 阅读 · 0 评论 -
linux raise()函数给自己发信号;abort()函数给自己发送异常终止信号,并产生core文件
int raise(int sig);void abort(void);//自己给自己发送6号信号,SIGABRT原创 2020-02-17 16:50:36 · 686 阅读 · 0 评论 -
Linux kill()函数杀死指定进程
int kill(pid_t pid, int sig);pid取值:pid>0发送信号给指定进程pid=0发送信号给自身所在的所有进程,包括自己也会被杀死pid<-1发送信号给进程组id为|pid|的进程组,会杀死该进程组的所有进程;pid<-1发送信号给有权限发送的系统中的所有进程...原创 2020-02-17 16:41:06 · 1547 阅读 · 3 评论 -
Linux 内存映射
void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset); int munmap(void *addr, size_t length);mmap参数addr为内存映射区的地址,一般由内核指定一般传NULLlength为映射文件的大小,内核会根据length的大小将其修改为4...原创 2020-02-17 16:28:27 · 95 阅读 · 0 评论 -
linux 读写锁
读写锁的适用场景:大量读操作,少量写操作;读并行,读写互斥,写互斥;#include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<pthread.h>#include<string.h>pthread_rwlock_t rwlock;int num=0;vo...原创 2020-02-16 15:45:11 · 178 阅读 · 0 评论 -
Linux互斥锁(互斥量)、线程分离
使用互斥锁实现线程同步时一般有四个步骤:初始化互斥锁 //pthread_mutex_init()加锁 //pthread_mutex_lock()、pthread_mutex_trylock解锁 //pthread_nutex_unlock()销毁锁 pthread_mutex_destroy()#include<stdio.h>#include<stdlib....原创 2020-02-16 11:12:54 · 184 阅读 · 0 评论 -
Linux 设置线程分离示例
#include<stdio.h>#include<string.h>#include<stdlib.h>#include<unistd.h>#include<pthread.h>void* thread_func(void* arg){ int i=1; while(i<10) ...原创 2020-02-16 09:35:51 · 158 阅读 · 0 评论 -
linux进程间通信(IPC interProcess Communication)
进程间通信常用的四种方式管道信号共享映射区本地套接字管道(管道可以用fcntl设置非阻塞属性)Linux将管道视为一种特殊文件,因此可以使用问价接口来操作管道;但管道属于一种特殊文件,它没有数据块,只通过系统内存存放要传送的数据。管道中的数据只能由一端传送到另一端,因此管道被设计为环形的数据结构,如此既能实现管道的循环利用,又能方便内核对管道的管理。管道实质上是内上的一块缓冲区。...原创 2020-02-15 10:57:35 · 204 阅读 · 0 评论 -
Linux wait()、waitpid()实现进程同步
特殊进程Linux系统中有两种特殊进程:僵尸进程、孤儿进程;僵尸进程:当程序调用exit()函数后,该进程并不是马上就消失,而是留下一个称为僵尸进程的数据结构。僵尸进程是一种特殊的进程,他几乎放弃进程退出前占用的所有内存,既没有可执行代码也不能被调度,只在进程列表中留下一个位置,记载进程退出状态等信息供父进程收集。若父进程中没有回收子进程的代码,子进程会一直处于僵尸状态。子进程退出后...原创 2020-02-13 08:51:47 · 1265 阅读 · 0 评论 -
Linux fcntl函数
fcntl()函数可以用来复制一个已经有了的文件描述符int fd2=fcntl(fd,F_DUPFD);fcntl()函数可以用来获取文件状态标志文件状态标志表示就相当于open()函数的第二个参数int flag=fcntl(fd,F_FETFL);设置文件状态标识常用的几个可以修改的文件标识O_APPEND,O_NONBLOCKflag=flag|O_APPEND;fcn...原创 2020-02-10 10:12:18 · 136 阅读 · 0 评论 -
Linux dup、dup2复制文件描述符
#include<stdio.h>#include<string.h>#include<unistd.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>int main(){ char buf[20]="wwjwoaini!";...原创 2020-02-10 09:20:37 · 187 阅读 · 0 评论 -
linux opendir()、readdir()函数遍历目录,获取文件名和数量
#include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<dirent.h>#include<string.h>unsigned long long totle=0;unsigned long long getfile(char* path){ ...原创 2020-02-09 19:16:05 · 2004 阅读 · 0 评论 -
linux 用getcwd()函数获取当前进程的工作路径
char *getcwd(char *buf, size_t size);获取的路径放进buf缓冲区里面,size为缓冲区的大小,返回值是指向buf的指针原创 2020-02-09 12:32:55 · 473 阅读 · 0 评论 -
Linux chdir切换进程当前工作目录
int chdir(const char *path);在一个程序中使用这个函数,可以切换进程的当前工作路径原创 2020-02-09 12:28:31 · 817 阅读 · 0 评论 -
Linux truncate()函数修改文件大小
int truncate(const char *path, off_t length);path修改文件的路径length文件的最终大小,比原来大,向后拓展,比原来小,删掉后边的部分原创 2020-02-09 12:08:32 · 363 阅读 · 0 评论 -
linux access()函数判断当前用户是否拥有wrx权限,文件是否存在
#include<stdio.h>#include<stdlib.h>#include<unistd.h>int main(int argc,char * argv[]){ int ret=access(argv[1],W_OK); if(ret==-1) { perror(...原创 2020-02-09 11:49:46 · 139 阅读 · 0 评论 -
linux用stat函数获取文件各项信息
stat命令查看某个文件的信息:vijay@vijay-virtual-machine:~/project/io$ stat nonblock_read.c File: nonblock_read.c//文件名 Size: 530//文件大小 Blocks: 8 IO Block: 4096 regular fileDevice: 804h/205...原创 2020-02-09 11:13:01 · 322 阅读 · 0 评论 -
linux非阻塞读终端示例
#include<unistd.h>#include<stdlib.h>#include<string.h>#include<errno.h>#include<fcntl.h>#include<stdio.h>#define MSG_AGAIN "try again\n"int main(){ ...原创 2020-02-08 13:23:54 · 203 阅读 · 0 评论 -
Linux阻塞读终端
Linux下一切皆文件,终端也是文件,在/dev目录下#include<unised.h>#include<stdlib.h>#include<stdio.h>int mian(){ char buf[512]; int n; n=read(STDIN_FILENO,buf,512); if(n==-1) { perror("read...原创 2020-02-08 11:41:23 · 195 阅读 · 0 评论 -
截取8bite数据的2-4位例子
#include<stdio.h>int main(){ char a; printf("请输入数字:"); scanf("%hhd",&a); a>>=2; a&=~(~0<<4); printf("%d",a); return ...原创 2020-02-07 20:24:20 · 403 阅读 · 0 评论 -
循环右移的实现小例子
#include<stdio.h>struct bit{ unsigned a:8; unsigned b:8; unsigned c:8;} bite;int main(){ printf("请输入需要右移的位数:"); int n; unsigned char a; ...原创 2020-02-08 11:43:23 · 632 阅读 · 0 评论 -
c语言 位运算和位运算符
位运算符含义&按位与|按位或^按位异或~取反<<左移>>右移位运算符中除了~,其他均为二元运算符,需要两个操作数;操作数可以是整型和字符型,单数不能为浮点型;按位与:有假即假0&0=0 0&1=01&0=0 1&1=1按位或:有真即真0|0=0 0|1...原创 2020-02-07 12:56:48 · 493 阅读 · 0 评论 -
Linux 文件描述符表
上图为虚拟地址空间结构图;在内核区的进程管理模块中有个进程控制块(PCB),实质上是个四百多行的结构体;在进程控制块中有个文件描述符表,如下图:文件描述符表中最多能存储1024个文件描述符;下面讲一下文件描述符表如何存储文件的各种信息文件描述符表还依赖另外两个表协同工作,分别是打开文件表和i-node表,这两张表整个系统只有一份,而文件描述符表每一个进程中都有一张;每一个文件描述符...原创 2020-02-05 19:09:16 · 1054 阅读 · 0 评论 -
linux虚拟地址空间
linux操作系统会为每一个运行的程序分配0-4G的地址空间(虚拟地址空间);0-4G是对于32位操作系统来说的2的32次方;如果是64位操作系统,则分配0到2的64次方;0-4G只是理论值,最大分配4G,实际分配没有那么多;虚拟地址空间分为两部分,拿32位操作系统举例;3-4G是内核区(内核空间),0-3G是用户区(用户空间),也就是内核区相对于用户区位于高地址空间;内核空间是受保护...原创 2020-02-05 18:08:56 · 482 阅读 · 0 评论