linux 下C语言编程(2)——进程的创建,挂起,解挂,进程间通信
在 linux 下利用C语言实现进程的创建,挂起和解挂操作
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <wait.h>
#include <errno.h>
#include <stdlib.h>
/***********************************************************功能说明:在 linux 下利用C语言实现进程的创建,挂起和解挂操作author: ***********************************************************/
void waitprocess();int main(int argc, char * argv[])
{waitprocess();}void waitprocess()
{int count = 0;pid_t pid = fork();int status = -1;if(pid<0){printf("fork错误因为 %m\n",errno );}else if(pid>0){printf("这是父进程 pid = %d\n",getpid() );printf("父进程 挂起\n");wait(&status);//父进程执行到此,马上阻塞自己,直到有子进程结束}else{printf("创建 子进程\n");printf("这是子进程 pid = %d ,父进程为 ppid = %d\n",getpid(),getppid() );int i;for (i = 0; i < 10; i++) {count++;sleep(1);printf("父进程已挂起 %d 秒\n", count) ;}exit(5);}printf("子进程的退出状态exit status 为 %d\n", WEXITSTATUS(status));//status是按位存储的状态信息printf("父进程 解挂\n");printf("从 pid = %d\(父进程\) 结束程序\n",getpid() );
}
Linux编程基础之进程等待(wait()函数)
进程间通信一:使用消息队列
msgsend.c:
#include <unistd.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <sys/msg.h>#include <errno.h>#define MAX_TEXT 512 struct msg_st{long int msg_type; char text[MAX_TEXT];};int main(){int running = 1; struct msg_st data; char buffer[BUFSIZ];int msgid = -1;//建立消息队列 msgid = msgget((key_t)1234, 0666 | IPC_CREAT);if(msgid == -1){fprintf(stderr, "msgget failed with error: %d\n", errno);exit(EXIT_FAILURE);}//向消息队列中写消息,直到写入end while(running){//输入数据 printf("Enter some text: "); fgets(buffer, BUFSIZ, stdin); data.msg_type = 1; //注意2 strcpy(data.text, buffer);//向队列发送数据 if(msgsnd(msgid, (void*)&data, MAX_TEXT, 0) == -1){fprintf(stderr, "msgsnd failed\n");exit(EXIT_FAILURE);} //输入end结束输入if(strncmp(buffer, "end", 3) == 0)running = 0;sleep(1);}exit(EXIT_SUCCESS);}
msgsend.c:
#include <unistd.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <errno.h>#include <sys/msg.h>struct msg_st{long int msg_type;char text[BUFSIZ];};int main(){int running = 1;int msgid = -1;struct msg_st data;long int msgtype = 0; //注意1 //建立消息队列 msgid = msgget((key_t)1234, 0666 | IPC_CREAT);if(msgid == -1){fprintf(stderr, "msgget failed with error: %d\n", errno);exit(EXIT_FAILURE);}//从队列中获取消息,直到遇到end消息为止 while(running){if(msgrcv(msgid, (void*)&data, BUFSIZ, msgtype, 0) == -1){fprintf(stderr, "msgrcv failed with errno: %d\n", errno);exit(EXIT_FAILURE);}printf("You wrote: %s\n",data.text);//遇到end结束 if(strncmp(data.text, "end", 3) == 0)running = 0;}//删除消息队列 if(msgctl(msgid, IPC_RMID, 0) == -1){fprintf(stderr, "msgctl(IPC_RMID) failed\n");exit(EXIT_FAILURE);}exit(EXIT_SUCCESS);}
Linux进程间通信——使用消息队列
进程间通信二:使用共享内存
shmdata.h:
#ifndef _SHMDATA_H_HEADER #define _SHMDATA_H_HEADER #define TEXT_SZ 2048 struct shared_use_st { int written;//作为一个标志,非0:表示可读,0表示可写 char text[TEXT_SZ];//记录写入和读取的文本 }; #endif
shmread.c:
#include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <sys/shm.h> #include "shmdata.h" int main() { int running = 1;//程序是否继续运行的标志 void *shm = NULL;//分配的共享内存的原始首地址 struct shared_use_st *shared;//指向shm int shmid;//共享内存标识符 //创建共享内存 shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666|IPC_CREAT); if(shmid == -1) { fprintf(stderr, "shmget failed\n"); exit(EXIT_FAILURE); } //将共享内存连接到当前进程的地址空间 shm = shmat(shmid, 0, 0); if(shm == (void*)-1) { fprintf(stderr, "shmat failed\n"); exit(EXIT_FAILURE); } printf("\nMemory attached at %X\n", (int)shm); //设置共享内存 shared = (struct shared_use_st*)shm; shared->written = 0; while(running)//读取共享内存中的数据 { //没有进程向共享内存定数据有数据可读取 if(shared->written != 0) { printf("You wrote: %s", shared->text); sleep(rand() % 3); //读取完数据,设置written使共享内存段可写 shared->written = 0; //输入了end,退出循环(程序) if(strncmp(shared->text, "end", 3) == 0) running = 0; } else//有其他进程在写数据,不能读取数据 sleep(1); } //把共享内存从当前进程中分离 if(shmdt(shm) == -1) { fprintf(stderr, "shmdt failed\n"); exit(EXIT_FAILURE); } //删除共享内存 if(shmctl(shmid, IPC_RMID, 0) == -1) { fprintf(stderr, "shmctl(IPC_RMID) failed\n"); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); }
shmwrite.c:
#include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <sys/shm.h> #include "shmdata.h" int main() { int running = 1; void *shm = NULL; struct shared_use_st *shared = NULL; char buffer[BUFSIZ + 1];//用于保存输入的文本 int shmid; //创建共享内存 shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666|IPC_CREAT); if(shmid == -1) { fprintf(stderr, "shmget failed\n"); exit(EXIT_FAILURE); } //将共享内存连接到当前进程的地址空间 shm = shmat(shmid, (void*)0, 0); if(shm == (void*)-1) { fprintf(stderr, "shmat failed\n"); exit(EXIT_FAILURE); } printf("Memory attached at %X\n", (int)shm); //设置共享内存 shared = (struct shared_use_st*)shm; while(running)//向共享内存中写数据 { //数据还没有被读取,则等待数据被读取,不能向共享内存中写入文本 while(shared->written == 1) { sleep(1); printf("Waiting...\n"); } //向共享内存中写入数据 printf("Enter some text: "); fgets(buffer, BUFSIZ, stdin); strncpy(shared->text, buffer, TEXT_SZ); //写完数据,设置written使共享内存段可读 shared->written = 1; //输入了end,退出循环(程序) if(strncmp(buffer, "end", 3) == 0) running = 0; } //把共享内存从当前进程中分离 if(shmdt(shm) == -1) { fprintf(stderr, "shmdt failed\n"); exit(EXIT_FAILURE); } sleep(2); exit(EXIT_SUCCESS); }
Linux进程间通信——使用共享内存
linux 下C语言编程(2)——进程的创建,挂起,解挂,进程间通信相关推荐
- Linux下C语言编程-进程的创建
Linux下C语言编程-进程的创建 作者:hoyt 1.进程的概念 Linux操作系统是面向多用户的.在同一时间可以有许多用户向操作系统发出各种命令.那么操作系统是怎么实现多用户的环境呢?在现代的操作 ...
- linux+下c语言编程项目,精通UNIX下C语言编程与项目实践
cc -I //include 目录 -L //静态库目录?动态也可以 -l //小写L,接静态库名称?动态也可以 -DXXX='"XXFF"' //-D直接定义宏 -c 只编译 ...
- Linux下C语言编程
第1章 Linux下C语言编程简介 本章将简要介绍一下什么是Linux,C语言的特点,程序开发的预备知识,Linux下C语言开发的环境,程序设计的特点和原则以及编码风格等.通过本章的学习,可以对在Li ...
- 初识Linux下C语言编程
本章将简要介绍一下什么是Linux,C语言的特点,程序开发的预备知识,Linux下C语言开发的环境,程序设计的特点和原则以及编码风格等.通过本章的学习,可以对在Linux下使用C语言编程有一个基本的了 ...
- linux c语言工具,Linux下C语言编程环境的工具.doc
Linux下C语言编程环境的工具 Linux下C语言编程环境的工具 Linux下C语言编程环境的工具 要想在Linux下进行C语言编程,首先得搭建好一个编程环境.这里分别说明一下几个非常有用的软件包. ...
- 您知道Linux下C语言编程的一些注意事项吗_教育中国
您知道Linux下C语言编程的一些注意事项吗_教育中国 云风的 BLOG: 一个 C 接口设计的问题 一个 C 接口设计的问题 C 语言在本质上,参数传递都是值传递.不像 Pascal 和 C++ 可 ...
- linux c语言 ppt,Linux下C语言编程.ppt
Linux下C语言编程 Linux中C语言的重要性 Linux和C天生有不解之缘. Linux操作系统的内核主要是用C写的,另外Linux下的很多软件也是用C写的,特别是一些著名的服务软件,比如MyS ...
- linux下C语言编程操作数据库(sqlite3)
前言:C语言中通过调用 sqlite 的函数接口来实现对数据库的管理(创建数据库.创建表格.插入数据.查询.数据.删除数据等),掌握sqlite数据库的语法,以及sqlite提供的函数接口,那么在li ...
- linux下c语言编程书籍6,Linux下C语言编程-6.pdf
永远的下语言编程基础知识 页码, 首页编程技术正文 L inux下C语言编程 - -基础知识 作者 前言 这篇文章介绍在下进行语言编程所需要的基础知识在这篇文章当中我们将会学 内容 源程序编译 的编写 ...
最新文章
- DeepMind的AI能指导人类的直觉吗?
- python 追加到字典_扫描器篇(三)之python编写基于字典的网站目录探测脚本
- 用临时表的GridView分页
- java二维数组的常见初始化
- 爱着你,恨着你——BCGControlBar的Menu字体
- NSNull的用法和原理
- 【数据库考试】数据库期末考试试题及答案
- 计算机维修管理平台软件,美萍电脑行业管理软件(电脑业务管理系统、电脑维修管理系统、组装业务、电脑装机管理软件)--管理软件,美萍是专家!...
- 使用高德地图api在页面中展示地图
- C/S - Exploits 学习笔记
- 自然语言处理(NLP)的一般处理流程!
- 博才教育三校领导莅临湖南省智慧教育装备展示体验中心参观交流
- 计算机win7等级考试试题,计算机等级考试一级win7操作题.docx
- 对耦合电容、极间电容、旁路电容、去耦电容的理解小结
- Eclipse 自定义${date}变量格式的思路历程
- php 模拟数猴子数大王,猴子大王的问题
- 超实用!应对压力的几种做法
- 2015级吉大计算机博士生,这所211大学清退33名博士生!最长已读博15年……
- #春Phone计划#51CTO沙龙广州站活动
- Android八门神器(一):OkHttp框架源码解析
热门文章
- 悬臂式货架的选材及工艺流程
- C# NUnit的安装
- 松耦合的比较容易理解的解释
- Linux下glibc库说明一
- 计算机的操作系统教学设计,川教版信息技术七上第9课《计算机操作系统》教学设计1.doc...
- vosviewer 在线版简介~ 文献计量分析可视化软件
- JBI规范1.0[3]——概述
- Vue echarts封装
- 使用GRU进行天气变化的时间序列预测
- [Phonegap+Sencha Touch] 移动开发4、Sencha Touch初步使用