linux 进程创建 c语言,linux下进程创建的C语言程序
再给你一个多进程的例子:
#include
#include
#include
#include
#include
#define P_ALIVE 0
#define P_STOP 1
#define MAXTIMES 3
#define PROCNUM 3
#define TRUE 0
#define FALSE -1
struct processcfg{
int id; /* 编号 */
pid_t tPid; /* 进程id */
int tRunTimes; /* 运行次数 */
long tStartTime;
long tEndTime;
int tStatus;
};
struct processcfg *stProcess = NULL;
int ChildMain(struct processcfg *pstProcess)
{
while(1)
{
if(pstProcess->tRunTimes >= MAXTIMES)
{
time(&(pstProcess->tEndTime));
printf("child process stop\n", pstProcess->tPid);
exit(0);
}
pstProcess->tRunTimes ++;
printf("i am child run times\n",
pstProcess->tPid, pstProcess->tRunTimes);
sleep(1);
}
return TRUE;
}
int MakeChild(struct processcfg *pstProcess, int tId)
{
pid_t pid;
int status;
pid = fork();
if(pid < 0)
{
printf("\nfork child error\n");
return FALSE;
}
if(pid == 0)
{
pstProcess->id = tId;
pstProcess->tPid = getpid();
pstProcess->tRunTimes = 0;
pstProcess->tStatus = P_ALIVE;
setpgrp();
sleep(1);
ChildMain(pstProcess);
}
else
{
pstProcess->id = tId;
pstProcess->tPid = pid;
pstProcess->tRunTimes = 0;
pstProcess->tStatus = P_ALIVE;
time(&(pstProcess->tStartTime));
}
return pid;
}
/* 创建进程共享内存结构 */
void *initProcShm(int *id)
{
int i = 0, shmid;
FILE *fp = NULL;
key_t shmkey;
size_t shmsize;
struct processcfg *stProcess = NULL;
void *shmAddr;
char sFile[256];
memset(sFile, 0x00, sizeof(sFile));
strcpy(sFile, "PROCSHM");
if((fp = fopen(sFile, "a")) == NULL)
{
printf("\nopen file error\n", sFile);
return NULL;
}
fclose(fp);
shmkey = ftok("PROCSHM", 2);
shmsize = PROCNUM*sizeof(struct processcfg);
shmid = shmget(shmkey, shmsize, IPC_CREAT|0666);
if(shmid < 0)
{
printf("\nget share memory error\n");
return NULL;
}
shmAddr = (void *)shmat(shmid, (void *)0, 0);
if((long)shmAddr == -1)
{
printf("\nattach share memory error\n");
return NULL;
}
*id = shmid;
stProcess = (struct processcfg *)shmAddr;
for(i = 0; i < PROCNUM; i++)
{
memset(stProcess, 0x00, sizeof(struct processcfg));
stProcess->id = 0;
stProcess->tPid = 0;
stProcess->tRunTimes = 0;
stProcess->tStatus = P_ALIVE;
stProcess->tStartTime = 0;
stProcess->tEndTime = 0;
stProcess ++;
}
return shmAddr;
}
int main(int argc, char *argv[])
{
int i = 0, num = 0, shmid = 0;
pid_t pid = 0, cpid = 0;
struct processcfg *pstProcess = NULL;
pid = fork();
if(pid < 0)
{
printf("fork main err\n");
return FALSE;
}
if(pid == 0)
{
printf("main process begin to run\n");
return TRUE;
}
/* get process config share memory */
stProcess = (struct processcfg *)initProcShm(&shmid);
if(stProcess == NULL)
return FALSE;
num = 0;
pstProcess = stProcess;
for(i = 1; i <= PROCNUM; i++)
{
memset(pstProcess, 0x00, sizeof(struct processcfg));
if(MakeChild(pstProcess, num+1) < 0)
break;
num ++;
pstProcess ++;
}
printf("\n%d process created ...\n", num);
/* 检查是否所有子进程都退出 */
for(;;)
{
cpid = 0;
cpid = wait(NULL); /* wait a child process exit */
num = 0;
pstProcess = stProcess;
for(i = 0; i < PROCNUM; i++)
{
/* 当前退出的进程 */
if(pstProcess->tPid == cpid)
{
printf("%d %d %d\n",
pstProcess->tPid, pstProcess->tStartTime, pstProcess->tEndTime);
pstProcess->tStatus = P_STOP;
}
if(pstProcess->tStatus == P_ALIVE)
num ++;
pstProcess ++;
}
/* 所有子进程都结束,父进程退出 */
if(num == 0)
break;
}
/* detach share memory */
shmdt((char *)stProcess);
/* delete share memory */
shmctl(shmid, IPC_RMID, (struct shmid_ds *)0);
printf("\nparent process stop\n", argv[0], getpid());
return TRUE;
}
[[it] 本帖最后由 josen0205 于 2008-11-25 21:48 编辑 [/it]]
只有想不到,没有做不到
linux 进程创建 c语言,linux下进程创建的C语言程序相关推荐
- linux ps vsz malloc,认真分析下进程的内存,说说VSZ、RSS、PSS
进程占用的内存可以有以下这些类型:自身的代码 共享库的代码 运行过程分配的堆和栈 通过mmap映射的磁盘文件内容 1. 虚拟内存与物理内存 这里要区分两个概念,虚拟内存和物理内存.物理内存对于进程来说 ...
- 计算机不能创建用户,Win10安全模式下无法创建新账户怎么办
默认情况下,我们在win10系统的安全模式中都是无法直接创建新账户的,只要点击新建窗口就会出现一闪而退的问题.不过,有部分用户反馈自己有时候又偏偏需要通过这种方式来解决问题.这该怎么办呢?其实,微软并 ...
- linux emacs使用教程,在ubuntu下使用emacs编写C语言程序
在学习Programming in C的第二遍,我在虚拟机中安装了ubuntu系统,在其中用文本编辑器emacs来写程序,这是我的开始. 在ubuntu中用emacs来写程序,首先我们得先一步一步来, ...
- linux mysql 创建存储过程_linux系统下无法创建mysql存储过程问题
创建存储过程的完整命令: CREATE PROCEDURE pro1() begin declare b int default 0; end; mysql中运行存储过程创建语句错误结果: root@ ...
- mac vscode运行c语言,mac下如何使用vscode调试C程序
电脑已经安装了Xcode.vscode vscode也已经安装了如下插件 每次点击调试的时候,总是出现这个界 ] 本人项目文件情况如下: tasks.json { "version" ...
- oracle 创建工作日表,oracle下sql创建指定年份全年日期表(区分工作日)
作者的话: 当系统执行到本处sql时,将本年度(或指定年份)一整年365天对应的是否为工作日情况数据插入到指定表中(如:0表示工作日,1表示双休日,法定节假日手动调整). 1.创建表: create ...
- oracle创建导入数据库,unix下手动创建oracle以及imp数据导入
一.手动创建数据库步骤以及数据导入: 1.指定新的SID,我们这里创建一个以ecdsdb为名的SID. [oracle@localhost ~]$ export ORACLE_SID=ecdsdb 2 ...
- Linux的系统架构(linux由哪几部分组成?)
linux由以下几部分组成: 内核 bootloader 文件系统 shell 应用程序 下面分别来看: 什么是内核? 他是linux系统的核心 他往下链接硬件 网上链接应用程序 什么是bootloa ...
- Serverless 场景下 Pod 创建效率优化
作者 | 张翼飞 阿里云技术专家 来源|阿里巴巴云原生公众号 导读:众所周知,Kubernetes 是云原生领域的基石,作为容器编排的基础设施,被广泛应用在 Serverless 领域.弹性能力是 ...
- Golang语言快速上手到综合实战(Go语言、Beego框架、高并发聊天室、豆瓣电影爬虫) 下载
下载Golang语言快速上手到综合实战(Go语言.Beego框架.高并发聊天室.豆瓣电影爬虫) 下载地址:请加QQ:397245854 Go是Google开发的一种编译型,可并行化,并具有垃圾回收功能 ...
最新文章
- windbg+VM 设置内核调试环境(双机调试)
- php web server部署(PHP+Nginx+Redis+MySQL)
- 请不要做浮躁的人——转给即将上路或者正在路上的程序员朋友
- php 文字图片怎么保存为图片,php技术实现加载字体并保存成图片
- 计算机入域时域控用到的端口,【ADDC】域控需要开放的端口
- Java 8 StampedLocks与ReadWriteLocks和同步
- 基金委通报科研诚信违规违纪案件查处情况
- 固高板卡mct2008调试轴回零_固高运动控制的Home回零过程
- 数字证书及CA的详细理解
- fme坐标转换器_利用FME做坐标转换
- 自定义View时,用到Paint Canvas的一些温故,自定义Loading控件(动画五,“六边形”的旋转跳跃)
- 学生专用计算机abs什么意思,出现abs标志什么意思
- 58同城数据爬取+可视化分析
- canvas实现图像裁剪
- 使用node连接MongoDB的工具安装及配置
- java 图像特效之黑白 浮雕和底片
- EXCEL怎么批量在两字姓名中间加空格
- 懒惰、急躁和傲慢(Laziness, Impatience and hubris)
- 1996届瑞安市计算机学校,1996届校友
- 南加大计算机专业硕士申请,南加州大学计算机科学专业硕士申请条件独家整理附案例分析...
热门文章
- Myeclipse字符集设置
- 【学习笔记9】Linux常用命令6 - 压缩解压命令
- 一百个人眼中的一百种爱情
- 03_部署并访问项目,处理404,500(servlet+java bean+jsp的商城教程)
- Android Studio 红米3 一直运行或者debug不成功,提示 Failed to establish session 解决方案
- Mac MySQL重置Root密码
- [Java][Android][Process] 分享 Process 执行命令行封装类
- 使用folium制作出行地图
- BZOJ2565 最长双回文串
- js基础-14-JS阻止事件冒泡和默认事件