linux_c 网络开发日记(4)多进程程序设计

获取ID

#include<sys/types.h>

#include<unsstd.h>

。pid_t getpid(void)

获取本进程ID

。pid_t gettppid(void)

获取父进程ID

eg:

#include<stdio.h>

#include<unistd.h>

#include<stdlib.h>

int main (void)

{

printf("PID = %d\n", getpid());

printf("PPID = %d\n",getppid());

return 0;

}

#include<unistd.h>

pid_t fork(void)

功能:创建子进程

fork
的奇妙之处在于它被调用一次,却返回两次,有三种不同的返回值:

1、在父进程中,fork返回新创建的子进程的PID;

2、在子进程中,fork返回0;

3、如果出现错误,fork返回一个负值

创建进程-fork

eg:

#include<sys/types.h>

#include<unistd.h>

int main (void)

{

pid_t pid;

pid = fork();

if(pid<0)

printf("error in fork!%d\n",fork);

else
if(pid==0)

printf("i am the child process,id=%d\n",getpid());

else

printf("i am the parent process,id is %d\n",getppid());

}

在pid=fork()之前,只有一个程序在执行,但在执行了这句话之后,就变成了两个进程在执行了,这两个进程共享代码段,将要执行的吓一跳语句都是if(pid==0).两个进程中,原来就存在的那个进程就被称为父进程,出现新的那个被称为子进程,父子进程区别于进程标志符(PID)不同。

eg:

#include<stdio.h>

#include(unistd.h)

int main(void)

{

pid_t pid;

int count=0;

pid = fork();

count++;

printf("count=%d\n",count);

return
0;

}

运行结果:count =
1

count =
1

子进程的数据空间、堆栈空间都会从父进程得到一个拷贝,而不是共享,在子进程中对count进行+1操作,并没有影响父进程的count值,父进程的count值仍未0.

创建vfork

#include <sys/tppes.h>

#include<unistd.h>

pid_t vfork(void)

功能:创建子进程。

区别:

1、fork:子进程拷贝父进程的数据段。

vfork:子进程与父进程共享数据段

2、fork:父、子进程执行次序不确定

vfork:子进程先运行,父进程后运行

exec函数族

exec用被执行的程序替换调用它的程序。

区别:

fork创建一个新的进程,产生新的PID。

exec启动一个新程序,替换原有的进程,因此进程PID不会改变。

#include<unistd.h>

int execl(const
char *path,const
char * arg1,...)

参数:

path:被执行程序名(含完整路径)

arg1-argn:被执行程序所需的命令行参数,含程序名,以空指针NULL结束

eg:

#include<inistd.h>

int main(void)

{

execl("/bin/ls","ls","-al","/etc/passwd",(char
*)0");

}

执行效果和 ls -al /etc/passwd 
一样

int  execlp(const
char*path,const cahr * arg1,...)

参数:

arg1-argn:被执行程序所需的命令行参数,含程序名,以空指针NULL结束

path:被执行程序名(不含路径,将从path环境变量中查找改程序

int execv(const
char * path,char  *const argv[])

参数;

path:被执行程序名(含路径)

argv[]:所需命令行参数组。

#include <stdlib.h>

int system(const
char*string)

功能:调用fork产生子进程,由子进程调用/bin/sh -c string
来执行string所代表的命令。

eg:system.c

#include<stdlib.h>

int  main(void)

{

system("ls -al /etc/pawwsd");

}

进程等待

#include<sys/types.h>

#include<sys/wait.h>

pid_ wait(int status)

功能:阻塞该进程,直到其某个子进程退出。

eg:

#include <unistd.h>

#include <sys/types.h>

#include <sys/wait.h>

#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

#include <math.h>

/*

*

* */

int main(void)

{

pid_t child;

/* 创建子进程*/

if((child=fork())==-1)

{

printf("Fork Error : %s\n", strerror(errno));

exit(1);

}

else

{

if(child==0)
// 子进程

{

printf("the child process is run\n");

sleep(1); 
//子进程睡眠一秒,但并没有去运行父进程

printf("I am the child: %d\n", getpid());

exit(0);

}

else       
//父进程

{

wait(NULL);
//等到子进程退出,父进程才会运行

printf("the father process is run\n");

printf("I am the father:%d\n",getpid());

return
0;

}

}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-07 20:21:35

linux_c 网络开发日记(4)多进程程序设计的相关文章

linux应用开发-多进程程序设计

linux应用开发-多进程程序设计 一 创建进程 fork和vfork的区别 1 fork创建的子进程有自己的数据段和堆栈而vfork创建的子进程跟父进程共享数据段 二 进程退出 父进程能使用return 0和exit(0)而子进程只能使用exit(0) 三 execl和fork的区别 execl不创建子进程,而是覆盖后面的代码段 fork创建子进程,不覆盖代码段 四 相应的函数 1 创建进程 函数名   fork 函数原形 pid_t fork(void) 函数功能 创建一个子进程 所属头文件

微信小程序开发日记——高仿知乎日报(上)

本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP 要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该教程分为以下三篇 微信小程序开发日记--高仿知乎日报(上) 微信小程序开发日记--高仿知乎日报(中) 微信小程序开发日记--高仿知乎日报(下) 三篇分别讲不同的组件和功能块 这篇要讲 API分析 启动页 轮播图 日报列表 浮动按钮 侧滑菜单 API分析 以下是使用到的具体API,更加详细参数和返回结

iOS开发系列--网络开发

iOS开发系列--网络开发 2014-10-22 08:34 by KenshinCui, 50097 阅读, 53 评论, 收藏,  编辑 概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博.微信等,这些应用本身可能采用iOS开发,但是所有的数据支撑都是基于后台网络服务器的.如今,网络编程越来越普遍,孤立的应用通常是没有生命力的.今天就会给大家介绍这部分内容: Web请求和响应 使用代理方法 简化请求方法 图片缓存 扩展--文件分段下载 扩展--文件上传 NSURLSession

【原创】shadowebdict开发日记:基于linux的简明英汉字典(三)

全系列目录: [原创]shadowebdict开发日记:基于linux的简明英汉字典(一) [原创]shadowebdict开发日记:基于linux的简明英汉字典(二) [原创]shadowebdict开发日记:基于linux的简明英汉字典(三) [原创]shadowebdict开发日记:基于linux的简明英汉字典(四) 项目的github地址 承接上文. 现在来进行response模块的开发. 这一模块所完成的任务是,如果本地的词库中没有用户需要查询的词汇,那么就去网络上寻找到相应的词条作为

【Android的从零单排开发日记】之入门篇(六)——Android四大组件之Broadcast Receiver

广播接受者是作为系统的监听者存在着的,它可以监听系统或系统中其他应用发生的事件来做出响应.如设备开机时,应用要检查数据的变化状况,此时就可以通过广播来把消息通知给用户.又如网络状态改变时,电量变化时都可以通过广播来通知用户.要做比喻的话,广播就像是我们的感官,能够有效且快速的从外界获取信息来反馈给自身. 一.广播的功能和特征 广播的生命周期很短,经过 调用对象—实现onReceive—结束 整个过程就结束了.从实现的复杂度和代码量来看,广播无疑是最迷你的Android 组件,实现往往只需几行代码

xxx学院后勤综合管理系统开发日记1

项目开发原因:为了配合部门两个从其他部门过来的维修科故障工作展开,现把一个网络故障保障和后勤维修的系统合拼成为一个,就成了现在的xxx学院后勤综合管理系统. 开发功能扩展:除了保持原有的保障表单.分角色查看故障还有统计功能之外,还加一个权限管理,物资管理和车辆管理还有一个办公oa额外附加的拼车功能.此外还有附加系统监控和控制开关.数据字典等.不知道还有没有其他需求,有的话就类似增加了. 开发工具:asp.net 三层+前端居于lhgcore框架+ms sql2005(使用存储过程). 其他要求:

【Android的从零单排开发日记】之入门篇(八)——Android数据存储(下)

废话不多说了,紧接着来讲数据库的操作吧.Come On! 提到数据存储问题,数据库是不得不提的.数据库是用来存储关系型数据的不二利器.Android为开发者提供了强大的数据库支持,可以用来轻松地构造基于数据库的应用.Android的数据库应用,依托于当下最流行的开源嵌入式数据库SQLite.在Android中,应用的数据库文件是该应用私有的,存储在应用数据目录下的databases子目录内.从代码结构来看,Android的数据库实现可以分成两个层次,在底层通过C++调用SQLite的接口来执行S

大富翁开发日记

一个大胆的尝试:使用巨型lua协程来表示整个“一局”流程. lua协程是一个很另类的功能,有并发的影子但又不是真的并发,所以真正拿它来做大功能框架的范例不多,通常用于一些小型trick式设计.但这次我在大富翁里把它用到了“极致”:整个一局游戏,就是全部跑在一个协程里的! 简单的说:在开始按钮的点击响应函数里(自然是在“主协程”中),创建出用于新一局游戏的“run协程”,然后在这里面启动这一局的while大循环,共3层:第1层为每个回合,第2层为每个玩家,第3层为每个指令.每当要等待一个指令时,r

IOS网络开发概述

概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博.微信等,这些应用本身可能采用iOS开发,但是所有的数据支撑都是基于后台网络服务器的.如今,网络编程越来越普遍,孤立的应用通常是没有生命力的.今天就会给大家介绍这部分内容: Web请求和响应 使用代理方法 简化请求方法 图片缓存 扩展--文件分段下载 扩展--文件上传 NSURLSession 数据请求 文件上传 文件下载 会话 UIWebView 浏览器实现 UIWebView与页面交互 网络状态 目 录 Web请求和响应 使用代理