
Linux系统编程
Mr.禾
这个作者很懒,什么都没留下…
展开
-
linux中如何找到结构体类型的定义
可以直接用管道搜索,一般头文件都在usr/include/目录下;比如搜索sockaddr_in的结构体定义可以输入:grep "struct sockaddr_in {" -r /usr/include/ -n结果如下然后输入vi /usr/include/linux/in.h +230找到定义...原创 2020-11-04 10:03:03 · 1084 阅读 · 2 评论 -
pipe 父子进程间通过管道通信 linux系统编程
通过管道通信,一定是单向的,一个是写端,一个是读端#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include<sys/types.h>#include<string.h>int main(){ int fd[2]; pid_t pid; int ret =pipe(fd);// fd[0]代表读端,f原创 2020-10-20 14:50:02 · 346 阅读 · 1 评论 -
文件锁 进程间同步 (fcntl函数设置) linux系统编程
利用fcntl设置文件锁,先设置flock结构体相关属性,然后用函数设置:fcntl(fd,F_SETLKW,&f_lock);flock结构体如下:#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include<sys/types.h>int main(int argc,char *argv[]){ int fd;原创 2020-10-19 19:12:14 · 255 阅读 · 0 评论 -
进程间 互斥锁用法 linux系统编程
创建映射区,两个进程共享锁和操作变量。关键是改变锁的属性由线程共享改为进程共享pthread_mutexattr_t mutexattr;pthread_mutexattr_setpshared(&mm->mutexattr,PTHREAD_PROCESS_SHARED);//设置锁属性为进程间共享//PTHREAD_PROCESS_SHARED 进程间//PTHREAD_PROCESS_PRIVATE 线程间(默认)#include<stdio.h>#incl原创 2020-10-19 15:58:53 · 604 阅读 · 0 评论 -
linux系统编程 信号量 sem系列函数(生产者消费者模型)
信号量是升级的互斥锁,如果多个线程对一个对象的部分数据进行共享,使用互斥锁只能将整个对象锁住,虽然提高了多线程操作的安全性,但导致了并行性的下降,变成串行执行。原创 2020-10-19 14:49:05 · 647 阅读 · 0 评论 -
linux系统编程 条件变量 pthread_cond系列函数用法(线程同步 生产者消费者模型)
条件变量不是锁,但它可以造成线程阻塞,通常与互斥锁配合使用,给多线程提供一个会合的场所。生产者消费者模型生产者一定时间间隔生产商品,消费者购买,借助此模型理解线程间同步的思想#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include<sys/types.h>#include<pthread.h>#include<ti原创 2020-10-18 20:37:12 · 388 阅读 · 0 评论 -
linux系统编程 读写锁 pthread_rwlock相关函数用法
读写锁状态1.读模式下加锁状态(读锁)2.写模式下加锁状态(写锁)3.不加锁状态读写锁特性1.读写锁是“写模式加锁”时,解锁前,所有对该锁加锁的线程都会被阻塞。2.读写锁是“读模式加锁”时,如果线程以读模式对其加锁会成功;如果线程以写模式加锁会阻塞。3.读写锁是“读模式加锁”时,既有试图以写模式加锁的线程,也有试图以读模式加锁的线程。那么读写锁会阻塞随后的读模式锁请求。优先满足写模式锁。读锁、写锁并行阻塞,写锁优先级高。读写锁也叫共享-独占锁。当读写锁以读模式锁住时,它是以共享模式锁住的;当原创 2020-10-16 20:53:16 · 347 阅读 · 0 评论 -
linux系统编程 互斥量函数(pthread_mutex) 线程加锁
线程同步测试先看一个测试程序#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include<sys/types.h>#include<pthread.h>void* func(void *arg){ srand(time(NULL)); while(1) { printf("hello原创 2020-10-16 15:12:23 · 850 阅读 · 0 评论 -
linux系统编程 设置线程的栈属性 pthread_attr_setstack函数
#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include<sys/types.h>#include<pthread.h>#include<string.h>#define SIZE 0x10000000void *func(void *arg){ while(1) sleep(1);原创 2020-10-15 21:54:08 · 699 阅读 · 0 评论 -
linux系统编程 计算一个进程最多创建多少个线程
#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include<sys/types.h>#include<pthread.h>#include<string.h>void *func(void* arg){ while(1) sleep(1);}int main(){ pthr原创 2020-10-15 20:51:51 · 448 阅读 · 0 评论 -
linux系统编程 线程属性设置分离 (pthread_attr_相应函数用法)
见注释#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include<sys/types.h>#include<pthread.h>#include<string.h>void* func(void *arg){ printf("-----\n"); pthread_exit((void*)666)原创 2020-10-15 20:28:33 · 207 阅读 · 0 评论 -
linux系统编程 杀死(取消)线程
int pthraed_cancel(pthread_t thread);成功返回0;失败返回错误号;注意:线程的取消并不是实时的,而有一定的延时。需要等待线程到达某个取消点(检查点)。系统调用(进入内核)算作一个取消点。man 7 threads可以查看取消点函数pthread_testcancel()可以自己设置取消点#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<fcn原创 2020-10-15 17:11:46 · 635 阅读 · 0 评论 -
linux系统编程 线程分离(pthread_detach()函数)
线程分离状态:指定该状态,线程主动与主控线程断开关系。线程结束后,其退出状态不由其他线程获取,线程自己释放内存空间,释放PCB资源#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include<sys/types.h>#include<pthread.h>#include<string.h>void* func(vo原创 2020-10-15 10:44:25 · 472 阅读 · 0 评论 -
Linux系统编程 线程回收 (pthread_join函数)
pthread_join定义,回收线程并接收返回值单线程回收#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include<sys/types.h>#include<pthread.h>#include<string.h>typedef struct{ int val; char s[64];}原创 2020-10-15 10:35:37 · 449 阅读 · 0 评论 -
linux系统编程 线程创建(pthread_create函数)
1.线程(light-weight process)轻量级进程,也有PCB;2.从内核看进程和线程是一样的,都有各自不同的pcb,但是PCB中指向内存资源的三级页表是相同的。3.进程可以蜕变成线程4.线程可以看做寄存器和栈的集合。5.linux下,线程是最小的执行单元;进程是最小的分配资源单位。...原创 2020-10-14 21:43:33 · 2055 阅读 · 0 评论 -
Linux系统编程 创建一个守护进程
1.创建子进程 fork2.子进程创建新会话 setsid()3.改变进程的工作目录 chdir()4.指定文件掩码 umask()5 将文件描述符0\1\2重定向 /dev/null dup2()6.守护进程逻辑7.退出。。。一般不用#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include<sys/types.h&原创 2020-10-14 15:30:02 · 204 阅读 · 0 评论 -
linux系统编程 进程组的相关操作(setpgid函数、getpgid函数)
setpgid函数改变进程所属组getpgid函数获取当前进程组详见代码#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include<sys/types.h>#include<signal.h>void child_change(int signo){ printf("------child group ID ch原创 2020-10-14 10:29:51 · 657 阅读 · 0 评论 -
STDOUT_FILENO文件描述符的重定向及还原 (dup2函数用法) Linux系统编程
在重定向之前保存默认文件描述符,在向text文件写入后再还原STDOUT_FILENO描述符#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include<sys/types.h>int main(int argc, char* argv[]){ int sfd,ret; sfd=dup(STDOUT_FILENO); //原创 2020-10-13 21:06:50 · 2780 阅读 · 0 评论 -
子进程结束 SIGCHLD捕捉 Linux系统编程
循环回收循环创建10个子进程,并返回创建编号,回收子进程。注意,在捕捉回收函数中应该使用while循环回收;如果使用if,有可能在函数执行期间内,多个子进程死亡,但只会回收一个子进程。#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include<sys/types.h>#include<signal.h>#include&原创 2020-09-30 16:45:20 · 153 阅读 · 0 评论 -
全局变量的异步IO Linux系统编程
分析时序竟态的宏观分析;父子进程循环计数;如果不加sleep,那么flag在失去cpu处会永远为0。#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include<sys/types.h>#include<signal.h>int n=0,flag=0;void sys_err(char* str){ perr原创 2020-09-30 10:30:26 · 102 阅读 · 0 评论 -
时序竟态条件分析 sigsuspend函数 Linu系统编程
简单的自定义sleep函数#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include<sys/types.h>#include<signal.h>#include<errno.h>void cat_sig(int sig){ ;}unsigned int mysleep(unsigned int s原创 2020-09-09 20:48:22 · 212 阅读 · 0 评论 -
信号的捕捉 signal函数(sigaction) Linux系统编程
捕捉定时信号#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include<sys/types.h>#include<sys/time.h>#include<signal.h>void myfunc(int signo){ printf("hello world!\n");}int main(){原创 2020-09-08 19:57:58 · 408 阅读 · 0 评论 -
信号屏蔽 sig函数族(sigaddset,sigemptyset等)用法 Linux系统编程
屏蔽系统信号程序执行后,会循环打印未决信号集000----0000(32位),如果有相应信号输入,如ctrl+c,因为SIGINT被屏蔽,未决信号集中对应3号位置一直置为1(信号被屏蔽,无法被处理,处于未决状态),打印变为001-----0000(32),其他信号类似。#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include<sys/types原创 2020-09-08 16:46:30 · 1377 阅读 · 0 评论 -
定时 alarm函数简单用法 Linux系统编程
alarm定时1s内计数的值通过屏幕输出#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include<sys/types.h>int main(){ int i; alarm(1); //自然定时1s后进程自动退出 for(i=0;;i++) { printf("%d\n",i);原创 2020-09-08 14:32:07 · 256 阅读 · 0 评论 -
进程间通信 函数mmap用法 (linux系统编程)
#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include<sys/types.h>#include<sys/mman.h>#include<string.h>int main(){ int fd,len,ret; char* p=NULL; fd=open("mytest.txt",O_原创 2020-09-05 20:39:12 · 362 阅读 · 0 评论 -
wai函数用法 回收多个子进程(Linux系统编程)
回收单个子进程#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include<sys/types.h>#include<sys/wait.h>int main(){ pid_t pid,wpid; int statu; pid=fork(); if(pid==0) //子进程 {原创 2020-09-04 21:47:17 · 264 阅读 · 0 评论 -
exec函数与dup2重定向输出到文件(linux系统编程)
#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include<sys/types.h>int main(){ int fd; fd=open("ps.out",O_WRONLY|O_CREAT|O_TRUNC,0644); if(fd<0) { perror("open ps.out e原创 2020-09-04 21:33:10 · 726 阅读 · 0 评论 -
exec函数(linux系统编程)
execlp一般用来调用系统函数execl一般用来调用自定义函数#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include<sys/types.h>int main(){ pid_t pid; pid=fork(); if(pid==-1) { perror("fork error");原创 2020-09-04 21:32:19 · 233 阅读 · 0 评论 -
fork函数(linux创建新进程)
#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include<sys/types.h>int var=100;int main(){ pid_t pid; printf("xxxxxxxx\n"); pid=fork(); if(pid==-1)//创建失败 { perror("for原创 2020-09-04 21:16:38 · 197 阅读 · 0 评论