再给你一个多进程的例子:

#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语言程序相关推荐

  1. linux ps vsz malloc,认真分析下进程的内存,说说VSZ、RSS、PSS

    进程占用的内存可以有以下这些类型:自身的代码 共享库的代码 运行过程分配的堆和栈 通过mmap映射的磁盘文件内容 1. 虚拟内存与物理内存 这里要区分两个概念,虚拟内存和物理内存.物理内存对于进程来说 ...

  2. 计算机不能创建用户,Win10安全模式下无法创建新账户怎么办

    默认情况下,我们在win10系统的安全模式中都是无法直接创建新账户的,只要点击新建窗口就会出现一闪而退的问题.不过,有部分用户反馈自己有时候又偏偏需要通过这种方式来解决问题.这该怎么办呢?其实,微软并 ...

  3. linux emacs使用教程,在ubuntu下使用emacs编写C语言程序

    在学习Programming in C的第二遍,我在虚拟机中安装了ubuntu系统,在其中用文本编辑器emacs来写程序,这是我的开始. 在ubuntu中用emacs来写程序,首先我们得先一步一步来, ...

  4. linux mysql 创建存储过程_linux系统下无法创建mysql存储过程问题

    创建存储过程的完整命令: CREATE PROCEDURE pro1() begin declare b int default 0; end; mysql中运行存储过程创建语句错误结果: root@ ...

  5. mac vscode运行c语言,mac下如何使用vscode调试C程序

    电脑已经安装了Xcode.vscode vscode也已经安装了如下插件 每次点击调试的时候,总是出现这个界 ] 本人项目文件情况如下: tasks.json { "version" ...

  6. oracle 创建工作日表,oracle下sql创建指定年份全年日期表(区分工作日)

    作者的话: 当系统执行到本处sql时,将本年度(或指定年份)一整年365天对应的是否为工作日情况数据插入到指定表中(如:0表示工作日,1表示双休日,法定节假日手动调整). 1.创建表: create ...

  7. oracle创建导入数据库,unix下手动创建oracle以及imp数据导入

    一.手动创建数据库步骤以及数据导入: 1.指定新的SID,我们这里创建一个以ecdsdb为名的SID. [oracle@localhost ~]$ export ORACLE_SID=ecdsdb 2 ...

  8. Linux的系统架构(linux由哪几部分组成?)

    linux由以下几部分组成: 内核 bootloader 文件系统 shell 应用程序 下面分别来看: 什么是内核? 他是linux系统的核心 他往下链接硬件 网上链接应用程序 什么是bootloa ...

  9. Serverless 场景下 Pod 创建效率优化

    作者 | 张翼飞  阿里云技术专家 来源|阿里巴巴云原生公众号 导读:众所周知,Kubernetes 是云原生领域的基石,作为容器编排的基础设施,被广泛应用在 Serverless 领域.弹性能力是 ...

  10. Golang语言快速上手到综合实战(Go语言、Beego框架、高并发聊天室、豆瓣电影爬虫) 下载

    下载Golang语言快速上手到综合实战(Go语言.Beego框架.高并发聊天室.豆瓣电影爬虫) 下载地址:请加QQ:397245854 Go是Google开发的一种编译型,可并行化,并具有垃圾回收功能 ...

最新文章

  1. windbg+VM 设置内核调试环境(双机调试)
  2. php web server部署(PHP+Nginx+Redis+MySQL)
  3. 请不要做浮躁的人——转给即将上路或者正在路上的程序员朋友
  4. php 文字图片怎么保存为图片,php技术实现加载字体并保存成图片
  5. 计算机入域时域控用到的端口,【ADDC】域控需要开放的端口
  6. Java 8 StampedLocks与ReadWriteLocks和同步
  7. 基金委通报科研诚信违规违纪案件查处情况
  8. 固高板卡mct2008调试轴回零_固高运动控制的Home回零过程
  9. 数字证书及CA的详细理解
  10. fme坐标转换器_利用FME做坐标转换
  11. 自定义View时,用到Paint Canvas的一些温故,自定义Loading控件(动画五,“六边形”的旋转跳跃)
  12. 学生专用计算机abs什么意思,出现abs标志什么意思
  13. 58同城数据爬取+可视化分析
  14. canvas实现图像裁剪
  15. 使用node连接MongoDB的工具安装及配置
  16. java 图像特效之黑白 浮雕和底片
  17. EXCEL怎么批量在两字姓名中间加空格
  18. 懒惰、急躁和傲慢(Laziness, Impatience and hubris)
  19. 1996届瑞安市计算机学校,1996届校友
  20. 南加大计算机专业硕士申请,南加州大学计算机科学专业硕士申请条件独家整理附案例分析...

热门文章

  1. Myeclipse字符集设置
  2. 【学习笔记9】Linux常用命令6 - 压缩解压命令
  3. 一百个人眼中的一百种爱情
  4. 03_部署并访问项目,处理404,500(servlet+java bean+jsp的商城教程)
  5. Android Studio 红米3 一直运行或者debug不成功,提示 Failed to establish session 解决方案
  6. Mac MySQL重置Root密码
  7. [Java][Android][Process] 分享 Process 执行命令行封装类
  8. 使用folium制作出行地图
  9. BZOJ2565 最长双回文串
  10. js基础-14-JS阻止事件冒泡和默认事件