⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 多进程2.txt

📁 本资源中含有有关LINUX进程通信的一些文章
💻 TXT
📖 第 1 页 / 共 5 页
字号:
毛主席语录Linux系统下的字体简介- -| 回首页 | 2006年索引 | - -Linux下的多进程编程1Linux下的多进程编程2                                       

客户端(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语言编程--进程的创建 
http://linuxc.51.net 作者:hoyt (2001-05-08 11:32:30) 
前言:  
    这篇文章是用来介绍在Linux下和进程相关的各个概念.我们将会学到:  
1.进程的概念  
2.进程的身份  
3.进程的创建  
4.守护进程的创建  

-------------------------------------------------------------------------------- 
1。进程的概念  
    Linux操作系统是面向多用户的.在同一时间可以有许多用户向操作系统发出各种命令.那么操作系统是怎么实现多用户的环境呢? 在现代的操作系统里面,都有程序和进程的概念.那么什么是程序,什么是进程呢? 通俗的讲程序是一个包含可以执行代码的文件,是一个静态的文件.而进程是一个开始执行但是还没有结束的程序的实例.就是可执行文件的具体实现. 一个程序可能有许多进程,而每一个进程又可以有许多子进程.依次循环下去,而产生子孙进程. 当程序被系统调用到内存以后,系统会给程序分配一定的资源(内存,设备等等)然后进行一系列的复杂操作,使程序变成进程以供系统调用.在系统里面只有进程没有程序,为了区分各个不同的进程,系统给每一个进程分配了一个ID(就象我们的身份证)以便识别. 为了充分的利用资源,系统还对进程区分了不同的状态.将进程分为新建,运行,阻塞,就绪和完成五个状态. 新建表示进程正在被创建,运行是进程正在运行,阻塞是进程正在等待某一个事件发生,就绪是表示系统正在等待CPU来执行命令,而完成表示进程已经结束了系统正在回收资源. 关于进程五个状态的详细解说我们可以看《操作系统》上面有详细的解说。  
2。进程的标志  
    上面我们知道了进程都有一个ID,那么我们怎么得到进程的ID呢?系统调用getpid可以得到进程的ID,而getppid可以得到父进程(创建调用该函数进程的进程)的ID.  

#include   

pid_t getpid(void); 
pid_t getppid(void); 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -