Linux下C语言编程--进程通信、消息管理

消息的发送与接受模拟实现 使用系统调用msgget( ),msgsnd( ),msgrev( ),及msgctl( )编制一长度为1k的消息发送和接收的程序。 立即下载

前言:Linux下的进程通信(IPC)  
    Linux下的进程通信(IPC)  

1.POSIX无名信号量  
2.System V信号量  
3.System V消息队列  
4.System V共享内存  

-------------------------------------------------------------------------------- 
1。POSIX无名信号量     如果你学习过操作系统,那么肯定熟悉PV操作了.PV操作是原子操作.也就是操作是不可以中断的,在一定的时间内,只能够有一个进程的代码在CPU上面执行.在系统当中,有时候为了顺利的使用和保护共享资源,大家提出了信号的概念. 假设我们要使用一台打印机,如果在同一时刻有两个进程在向打印机输出,那么最终的结果会是什么呢.为了处理这种情况,POSIX标准提出了有名信号量和无名信号量的概念,由于Linux只实现了无名信号量,我们在这里就只是介绍无名信号量了. 信号量的使用主要是用来保护共享资源,使的资源在一个时刻只有一个进程所拥有.为此我们可以使用一个信号灯.当信号灯的值为某个值的时候,就表明此时资源不可以使用.否则就表>示可以使用. 为了提供效率,系统提供了下面几个函数  
POSIX的无名信号量的函数有以下几个:  

#include

int sem_init(sem_t *sem,int pshared,unsigned int value); 
int sem_destroy(sem_t *sem); 
int sem_wait(sem_t *sem); 
int sem_trywait(sem_t *sem); 
int sem_post(sem_t *sem); 
int sem_getvalue(sem_t *sem); 

sem_init创建一个信号灯,并初始化其值为value.pshared决定了信号量能否在几个进程间共享.由于目前Linux还没有实现进程间共享信号灯,所以这个值只能够取0. sem_destroy是用来删除信号灯的.sem_wait调用将阻塞进程,直到信号灯的值大于0.这个函数返回的时候自动的将信号灯的值的件一.sem_post和sem_wait相反,是将信号灯的内容加一同时发出信号唤醒等待的进程..sem_trywait和sem_wait相同,不过不阻塞的,当信号灯的值为0的时候返回EAGAIN,表示以后重试.sem_getvalue得到信号灯的值.  
由于Linux不支持,我们没有办法用源程序解释了.  
这几个函数的使用相当简单的.比如我们有一个程序要向一个系统打印机打印两页.我们首先创建一个信号灯,并使其初始值为1,表示我们有一个资源可用.然后一个进程调用sem_wait由于这个时候信号灯的值为1,所以这个函数返回,打印机开始打印了,同时信号灯的值为0 了. 如果第二个进程要打印,调用sem_wait时候,由于信号灯的值为0,资源不可用,于是被阻塞了.当第一个进程打印完成以后,调用sem_post信号灯的值为1了,这个时候系统通知第二个进程,于是第二个进程的sem_wait返回.第二个进程开始打印了.  
不过我们可以使用线程来解决这个问题的.我们会在后面解释什么是线程的.编译包含上面这几个函数的程序要加上 -lrt选贤,以连接librt.so库  
2。System V信号量 为了解决上面哪个问题,我们也可以使用System V信号量.很幸运的是Linux实现了System V信号量.这样我们就可以用实例来解释了. System V信号量的函数主要有下面几个.  

#include  
#include  
#include  

key_t ftok(char *pathname,char proj); 
int semget(key_t key,int nsems,int semflg); 
int semctl(int semid,int semnum,int cmd,union semun arg); 
int semop(int semid,struct sembuf *spos,int nspos); 

struct sembuf { 
short sem_num; /* 使用那一个信号 */ 
short sem_op; /* 进行什么操作 */ 
short sem_flg; /* 操作的标志 */ 
}; 


ftok函数是根据pathname和proj来创建一个关键字.semget创建一个信号量.成功时返回信号的ID,key是一个关键字,可以是用ftok创建的也可以是IPC_PRIVATE表明由系统选用一个关键字. nsems表明我们创建的信号个数.semflg是创建的权限标志,和我们创建一个文件的标志相同.  
semctl对信号量进行一系列的控制.semid是要操作的信号标志,semnum是信号的个数,cmd是操作的命令.经常用的两个值是:SETVAL(设置信号量的值)和IPC_RMID(删除信号灯).arg是一个给cmd的参数. 
semop是对信号进行操作的函数.semid是信号标志,spos是一个操作数组表明要进行什么操作,nspos表明数组的个数. 如果sem_op大于0,那么操作将sem_op加入到信号量的值中,并唤醒等待信号增加的进程. 如果为0,当信号量的值是0的时候,函数返回,否则阻塞直到信号量的值为0. 如果小于0,函数判断信号量的值加上这个负值.如果结果为0唤醒等待信号量为0的进程,如果小与0函数阻塞.如果大于0,那么从信号量里面减去这个值并返回.  
下面我们一以一个实例来说明这几个函数的使用方法.这个程序用标准错误输出来代替我们用的打印机.  

#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  

#define PERMS S_IRUSR|S_IWUSR 

void init_semaphore_struct(struct sembuf *sem,int semnum, 
int semop,int semflg) 
{ 
/* 初始话信号灯结构 */ 
sem->sem_num=semnum; 
sem->sem_op=semop; 
sem->sem_flg=semflg; 
} 

int del_semaphore(int semid) 
{ 
/* 信号灯并不随程序的结束而被删除,如果我们没删除的话(将1改为0) 
可以用ipcs命令查看到信号灯,用ipcrm可以删除信号灯的 
*/ 
#if 1 
return semctl(semid,0,IPC_RMID); 
#endif 
} 

int main(int argc,char **argv) 
{ 
 char buffer[MAX_CANON],*c; 
 int i,n; 
 int semid,semop_ret,status; 
 pid_t childpid; 
 struct sembuf semwait,semsignal; 

 if((argc!=2)||((n=atoi(argv[1]))<1)) 
  { 
fprintf(stderr,"Usage:%s number/n/a",argv[0]); 
exit(1); 
  } 
  
/* 使用IPC_PRIVATE 表示由系统选择一个关键字来创建  */ 
/* 创建以后信号灯的初始值为0 */ 
 if((semid=semget(IPC_PRIVATE,1,PERMS))==-1) 
   { 
fprintf(stderr,"[%d]:Acess Semaphore Error:%s/n/a", 
getpid(),strerror(errno)); 
exit(1); 
   } 

/* semwait是要求资源的操作(-1) */ 
init_semaphore_struct(&semwait,0,-1,0); 

/* semsignal是释放资源的操作(+1) */ 
init_semaphore_struct(&semsignal,0,1,0); 

/* 开始的时候有一个系统资源(一个标准错误输出) */ 
if(semop(semid,&semsignal,1)==-1) 
 { 
fprintf(stderr,"[%d]:Increment Semaphore Error:%s/n/a", 
getpid(),strerror(errno)); 
if(del_semaphore(semid)==-1) 
        fprintf(stderr,"[%d]:Destroy Semaphore Error:%s/n/a", 
                getpid(),strerror(errno)); 
exit(1); 
 } 

/* 创建一个进程链 */ 
for(i=0;i
 if(childpid=fork()) break; 

sprintf(buffer,"[i=%d]-->[Process=%d]-->[Parent=%d]-->[Child=%d]/n", 
i,getpid(),getppid(),childpid); 
c=buffer; 

/* 这里要求资源,进入原子操作 */ 
while(((semop_ret=semop(semid,&semwait,1))==-1)&&(errno==EINTR)); 
if(semop_ret==-1) 
 { 
fprintf(stderr,"[%d]:Decrement Semaphore Error:%s/n/a", 
   getpid(),strerror(errno)); 
 } 
else 
 { 
while(*c!='/0')fputc(*c++,stderr); 
/* 原子操作完成,赶快释放资源 */ 
while(((semop_ret=semop(semid,&semsignal,1))==-1)&&(errno==EINTR)); 
if(semop_ret==-1) 
         fprintf(stderr,"[%d]:Increment Semaphore Error:%s/n/a", 
                        getpid(),strerror(errno)); 
 } 

/* 不能够在其他进程反问信号灯的时候,我们删除了信号灯 */ 
while((wait(&status)==-1)&&(errno==EINTR)); 
/* 信号灯只能够被删除一次的 */ 
if(i==1) 
 if(del_semaphore(semid)==-1) 
        fprintf(stderr,"[%d]:Destroy Semaphore Error:%s/n/a", 
                        getpid(),strerror(errno)); 
exit(0); 
} 

信号灯的主要用途是保护临界资源(在一个时刻只被一个进程所拥有).  
3。SystemV消息队列 为了便于进程之间通信,我们可以使用管道通信 SystemV也提供了一些函数来实现进程的通信.这就是消息队列.  

  #include  
  #include  
  #include  

  int msgget(key_t key,int msgflg); 
  int msgsnd(int msgid,struct msgbuf *msgp,int msgsz,int msgflg); 
  int msgrcv(int msgid,struct msgbuf *msgp,int msgsz, 
long msgtype,int msgflg); 
  int msgctl(Int msgid,int cmd,struct msqid_ds *buf); 

struct msgbuf { 
long msgtype;   /* 消息类型 */ 
....... /* 其他数据类型 */ 
} 

msgget函数和semget一样,返回一个消息队列的标志.msgctl和semctl是对消息进行控制. msgsnd和msgrcv函数是用来进行消息通讯的.msgid是接受或者发送的消息队列标志. msgp是接受或者发送的内容.msgsz是消息的大小. 结构msgbuf包含的内容是至少有一个为msgtype.其他的成分是用户定义的.对于发送函数msgflg指出缓冲区用完时候的操作.接受函数指出无消息时候的处理.一般为0. 接收函数msgtype指出接收消息时候的操作.  
如果msgtype=0,接收消息队列的第一个消息.大于0接收队列中消息类型等于这个值的第一个消息.小于0接收消息队列中小于或者等于msgtype绝对值的所有消息中的最小一个消息. 我们以一个实例来解释进程通信.下面这个程序有server和client组成.先运行服务端后运行客户端.  
服务端 server.c 

#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  

#define   MSG_FILE "server.c" 
#define   BUFFER 255 
#define   PERM S_IRUSR|S_IWUSR 

struct msgtype { 
long mtype; 
char buffer[BUFFER+1]; 
}; 

int main() 
{ 
   struct msgtype msg; 
   key_t key; 
   int msgid; 
    
   if((key=ftok(MSG_FILE,'a'))==-1) 
    { 
fprintf(stderr,"Creat Key Error:%s/a/n",strerror(errno)); 
exit(1); 
    } 
   
  if((msgid=msgget(key,PERM|IPC_CREAT|IPC_EXCL))==-1) 
    { 
fprintf(stderr,"Creat Message  Error:%s/a/n",strerror(errno)); 
exit(1); 
    } 
   
  while(1) 
   { 
msgrcv(msgid,&msg,sizeof(struct msgtype),1,0); 
fprintf(stderr,"Server Receive:%s/n",msg.buffer); 
msg.mtype=2; 
msgsnd(msgid,&msg,sizeof(struct msgtype),0); 
   } 
  exit(0); 
}


-------------------------------------------------------------------------------- 

客户端(client.c) 

#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#define   MSG_FILE "server.c" 
#define   BUFFER 255 
#define   PERM S_IRUSR|S_IWUSR 

struct msgtype { 
long mtype; 
char buffer[BUFFER+1]; 
}; 

int main(int argc,char **argv) 
{ 
   struct msgtype msg; 
   key_t key; 
   int msgid; 
    
   if(argc!=2) 
    { 
fprintf(stderr,"Usage:%s string/n/a",argv[0]); 
exit(1); 
    } 

   if((key=ftok(MSG_FILE,'a'))==-1) 
    { 
fprintf(stderr,"Creat Key Error:%s/a/n",strerror(errno)); 
exit(1); 
    } 
   
  if((msgid=msgget(key,PERM))==-1) 
    { 
fprintf(stderr,"Creat Message  Error:%s/a/n",strerror(errno)); 
exit(1); 
    } 

  msg.mtype=1; 
  strncpy(msg.buffer,argv[1],BUFFER); 
  msgsnd(msgid,&msg,sizeof(struct msgtype),0);  
  memset(&msg,'/0',sizeof(struct msgtype)); 
  msgrcv(msgid,&msg,sizeof(struct msgtype),2,0); 
  fprintf(stderr,"Client receive:%s/n",msg.buffer); 
  exit(0); 
}  

注意服务端创建的消息队列最后没有删除,我们要使用ipcrm命令来删除的.  
4。SystemV共享内存 还有一个进程通信的方法是使用共享内存.SystemV提供了以下几个函数以实现共享内存.  

#include  
#include  
#include  

int shmget(key_t key,int size,int shmflg); 
void *shmat(int shmid,const void *shmaddr,int shmflg); 
int shmdt(const void *shmaddr); 
int shmctl(int shmid,int cmd,struct shmid_ds *buf); 

shmget和shmctl没有什么好解释的.size是共享内存的大小. shmat是用来连接共享内存的.shmdt是用来断开共享内存的.不要被共享内存词语吓倒,共享内存其实很容易实现和使用的.shmaddr,shmflg我们只要用0代替就可以了.在使用一个共享内存之前我们调用shmat得到共享内存的开始地址,使用结束以后我们使用shmdt断开这个内存.  

#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  

#define PERM S_IRUSR|S_IWUSR 

int main(int argc,char **argv) 
{ 
  
 int shmid; 
 char *p_addr,*c_addr; 
 if(argc!=2) 
  { 
fprintf(stderr,"Usage:%s/n/a",argv[0]); 
exit(1); 
  } 

 if((shmid=shmget(IPC_PRIVATE,1024,PERM))==-1) 
  { 
fprintf(stderr,"Create Share Memory Error:%s/n/a",strerror(errno)); 
exit(1); 
  } 
 if(fork()) 
  { 
p_addr=shmat(shmid,0,0); 
memset(p_addr,'/0',1024); 
strncpy(p_addr,argv[1],1024); 
exit(0); 
  } 
 else 
  { 
c_addr=shmat(shmid,0,0); 
printf("Client get %s",c_addr); 
exit(0); 
  }  
}  

这个程序是父进程将参数写入到共享内存,然后子进程把内容读出来.最后我们要使用ipcrm释放资源的.先用ipcs找出ID然后用ipcrm shm ID删除.  
后记:  
进程通信(IPC)是网络程序的基础,在很多的网络程序当中会大量的使用进程通信的概念和知识.其实进程通信是一件非常复杂的事情,我在这里只是简单的介绍了一下.如果你想学习进程通信的详细知识,最好的办法是自己不断的写程序和看联机手册.现在网络上有了很多的知识可以去参考.可惜我看到的很多都是英文编写的.如果你找到了有中文的版本请尽快告诉我.谢谢!  
Linux下C语言编程——进程通信 linux下c语言编程1-18\Linux下C语言编——进程通信.doc 立即下载

相关推荐

基于Linux操作系统C语言开发的多人聊天室程序设计与实现.docx

里面附有源代码,加上详细的设计步骤,使用了C语言开发,功能有服务器和客户端的消息接收与发送,以及退出功能

进程通信linux代码c语言,(进程间通信)linux c语言实现消息队列

发送端代码:/***************************************************##filename : msggetS.c##author : GYZ##e-mail : 1746902011@qq.com##create time : 2018-10-18 15:52:07##last modified : 2018...

weixin_30480859的博客 209

linux多人聊天室管理系统(附实验报告)(附源代码)

本设计主要实现一个Linux下的局域网聊天工具的设计。该设计主要分为两部分,客户端部分和服务器部分。设计并实现一个简单的聊天室程序,用户名/密码注册和登录,客户端登陆到服务器聊天后,可以在聊天室内与其他用户交流。 1、 能做到3个以上用户之间的聊天; 辅助: 2 、系统要有用户管理功能; 3、 每个用户能管理自己的权限,比如 不接受信息,撤销已发的信息等;可以自己发挥; 4 、聊天信息的保存,比如保存三天内的信息,或其他规定; 5 、敏感词的过滤等等;

操作系统实验:Linux进程管理

实验内容 (1)实现一个模拟的shell 编写三个不同的程序:cmd1.c, cmd2.c, cmd3.c,每个程序输出一句话,分别编译成可执行文件cmd1, cmd2, cmd3。然后再编写一个程序,模拟shell程序的功能,能根据用户输入的字符串(表示相应的命令名),去为相应的命令创建子进程并让它去执行相应的程序,而父进程则等待子进程的结束,然后再等待接收下一条命令。如果接收到的命令为exit,则父进程结束,如果接收到无效命令,则显示”command not found”,继续等待。 (2)实现一个管道

征服所有不服的博客 6166

立创·庐山派-K230-CanMV(嘉楠勘智)开发板通过ATK-ESP8266实现图像识别数据无线传输至原子云

本文详细介绍了如何使用立创·庐山派-K230-CanMV开发板,通过ATK-ESP8266 WIFI模块实现图像识别数据的无线传输至原子云平台。内容包括硬件连接、软件环境搭建、AT指令控制、原子云连接及数据上传的全过程,并提供了实用的调试技巧和常见问题解决方案,为物联网应用开发提供了完整实践指南。

potato的博客 743

Kylin-Desktop-V10-SP1海光版虚拟机安装全流程(含桥接网络配置)

本文详细介绍了在VMware虚拟机中安装Kylin-Desktop-V10-SP1海光版操作系统的完整流程,重点解决了基于海光(Hygon C86)平台的网络配置难题。内容涵盖从镜像准备、虚拟机创建、系统安装到桥接网络配置的三种实战方法,并提供了安装后的优化与必备软件配置指南,帮助用户高效搭建国产化测试与开发环境。

weixin_29323493的博客 354

linux 进程通信――C语言实现

linux 进程通信――C语言实现 2010年10月15日   linux中的进程通信分为三个部分:低级通信,管道通信和进程间通信IPC(inter process communication)。linux的低级通信主要用来传递进程的控制信号--文件锁和软中断信号机制。linux的进程间通信IPC有三个部分--①信号量,②共享内存和③消息队列。以下是我编写的linux进程通信的C语言实现...

npjev02v 237

嵌入式下载故障排查:ST-LINK与GD32 Programmer典型问题解决

嵌入式固件烧录是MCU开发的关键环节,其本质依赖于调试器(如ST-LINK、GD-Link)与目标芯片间的协议通信、驱动加载及硬件接口协同。原理上,SWD/JTAG协议需在正确时序、电平与供电条件下完成设备枚举、ID读取与Flash编程;技术价值在于保障量产烧录稳定性与调试可重复性;典型应用场景涵盖STM32/GD32教学开发、工业控制板量产调试及Windows 11新系统适配。本文聚焦ST-LINK-V2在Keil MDK中的下载失败和GD32 All In One Programmer的DLL加载异常两

weixin_35006125的博客 153

Linux下C语言编程 -- 进程通信、消息管理

1。POSIX无名信号量   如果你学习过操作系统,那么肯定熟悉PV操作了.PV操作是原子操作.也就是操作是不可以中断的,在一定的时间内,只能够有一个进程的代码在CPU上面执行.在系统当中,有时候为了顺利的使用和保护共享资源,大家提出了信号的概念.假设我们要使用一台打印机,如果在同一时刻有两个进程在向打印机输出,那么最终的结果会是什么呢.为了处理这种情况,POSIX标准提出了有名信号量

james@BJ的专栏 737

OpenIddict实战指南:在.NET Core中构建安全的OAuth 2.0与OpenID Connect服务

本文详细介绍了如何在.NET Core中使用OpenIddict框架构建安全、标准的OAuth 2.0与OpenID Connect授权服务。内容涵盖从快速搭建授权服务器、理解核心配置与授权流程,到集成用户数据库、实现完整登录授权,以及生产环境下的安全加固与部署指南,为.NET开发者提供了一套现代、可维护的认证授权解决方案。

weixin_29229989的博客 355

深度学习实战42-基于大模型开发MathGPT的原理介绍,让数学问题智能解答变为可能

大家好,我是微学AI,今天给大家介绍一下深度学习实战42-基于大模型开发MathGPT的原理介绍,让数学问题智能解答变为可能。在去年ChatGPT的发布后,各种国内外的大语言模型层出不穷涌现,但是大家都知道现在的模型的诟病的数学能力不足,就算是简单的数学题都可能算错,今天我就来给大家引入MathGPT的模型,用来解决GPT解决数学问题,对于简单的初中数学高中数学都可以解决,让数学问题精准答题得到实现。

微学AI的博客 1651

linux 系统编程之-程序设计

第1章 入门 1.2.1 linux程序 (1)Linux应用程序表现为2种特殊类型的文件: A)可执行文件:计算机可以直接运行的文件。 B)脚本文件:一组指令的集合,这些指令将由另一个程序(解释器)来执行。 (2)登陆Linux系统时,与一个shell程序进行交互,它在一组给定目录路径下按照给出的程序名搜索与之同名的文件,搜索的目录存储在shell变量PATH里,搜索路径由系统管理员配置,它...

王道长的技术博客 8964

FX5U PLC运动控制库安装(PLCopen Motion Control FB参考)

下面我们介绍三菱FX5U PLC的运动控制库PLCopen Motion Control FB的安装。

RXXW_Dor的博客 1524

linux+下c语言编程项目,精通UNIX下C语言编程与项目实践

cc-I //include 目录-L //静态库目录?动态也可以-l //小写L,接静态库名称?动态也可以-DXXX=‘“XXFF”’ //-D直接定义宏-c 只编译-O 优化-g 生成调试信息splint , gprof, cflow , dbx , gdb ,sdb //除了工具,还有日志记录调试更便捷动态库:隐式调用 自动加载,与静态库一致 使用时,cc 后面加上路径,接口不变可以直接换...

weixin_39612220的博客 305

解决Windows 11文件右键菜单卡死问题的方法

当你右键点击一个文件或者文件夹时,系统会加载与该文件类型相关的上下文菜单项,如果其中某个菜单项的代码执行时间过长或者出现错误,就会导致整个右键菜单卡死。综上所述,当你在Windows 11中遇到右键菜单卡死的问题时,你可以尝试禁用上下文菜单项、重置文件关联、排除第三方软件干扰、修复系统文件以及优化代码等方法来解决问题。如果你是一个开发者,并且你自己编写了一个上下文菜单项,那么问题可能出在你的代码中。例如,如果你遇到了图片文件的右键菜单卡死问题,你可以找到".jpg"或".png"等相关的子项。

HnrzLinux的博客 7536

道威棱镜的设计参考

道威棱镜的设计参考

weixin_72050316的博客 381

用消息队列实现银行管理系统项目。

银行管理系统项目: 主要有六个功能: 1开户2.取钱3存钱4取钱5转账6查询 服务器端:获取两个消息队列的id,开进程调用六个功能执行execl 函数族关闭服务器的时候会删除消息队列杀死六个子进程 客户端:输入信息发送到消息队列接受消息队列的信息并做处理.、

m0_66108445的博客 378

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

进程通信-消息队列

进程通信-消息队列  来源:https://blog.youkuaiyun.com/wh_sjc/article/details/70283843   进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。 IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中 Socket和Streams支持不同主机上的两个进程IPC。 以Linux中的C语言编程为例。 一、管道 管道,

Gerald_Jones的博客 529

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Linux消息队列

Linux操作系统system V进程间通信,主要有三种: 1、消息队列; 2、信号量; 3、内存共享。       消息队列是消息的链表,存放在内核中并由消息队列标识符标识。 Linux消息队列管理: 1、创建消息队列      在使用一个消息队列前,需要使用msgget函数创建该消息队列,其函数声明:      extern int magget(key_t _key,int _msgflg)

195

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

linux操作系统下c语言编程入门

linux操作系统下c语言编程入门 分类:linux2006-03-30 10:597389人阅读评论(2)收藏举报 2)Linux程序设计入门--进程介绍3)Linux程序设计入门--文件操作4)Linux程序设计入门--时间概念5)Linux程序设计入门--信号处理6)Linux程序设计入门--消息管理7)Linux程序设计入门--线程操作8)Linux程序设计入门...

weixin_33676492的博客 654
上一篇: Linux源代码查看工具
下一篇: Linux下C语言编程--基础知识
压屏哥
博客等级 码龄19年 40粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值