Unix系统编程
来源:互联网 发布:dom编程艺术第三版 编辑:程序博客网 时间:2024/05/16 01:24
fork系统调用:
pid_t fork(void);
一个成功的fork调用将促使内核创建一个新的进程,该进程是调用进程的一个精确副本。
pid = fork();
其中的pid可以用来区分父进程和子进程。在父进程中,pid被设置为一个非零的正整数,而在子进程中被设置为零。返回到父进程的pid值,称为子进程的进程id。
这段程序创建两个子进程,每个子进程再创建一个它们自己的子进程。在每个fork之后,每个父进程打印其后代进程的进程id。
使用exec运行新程序:
所有exec函数族都完成同一功能:装载一个新的程序,并将之转换到调用进程的内存空间。如果调用成功,调用程序将被新的程序覆盖,并且从新程序的起始处开始运行,并保持与原调用进程相同的进程id。
本例中,在成功调用execl之后,调用进程被覆盖,所以就不执行perror,由此可知,当execl和相关调用返回时,它们通常返回-1。
将exec和fork一起使用:
fork调用之后,父进程执行wait系统调用,导致A进程挂起直到B进程终止。
pid_t fork(void);
一个成功的fork调用将促使内核创建一个新的进程,该进程是调用进程的一个精确副本。
pid = fork();
其中的pid可以用来区分父进程和子进程。在父进程中,pid被设置为一个非零的正整数,而在子进程中被设置为零。返回到父进程的pid值,称为子进程的进程id。
pid_t pid;
pid_t cid,did;
printf("Just One process so far ");
printf("Calling fork... ");
pid = fork();
if(pid == 0)...{
printf("I'm the child. ");
cid = fork();
if(cid > 0) printf("grandson1 id = %d. ",cid);
if(cid == 0) printf("I'm the grandson1 process ");
}
else if(pid > 0) ...{
printf("I'm the parent ,child has pid %d ",pid);
did = fork();
if(did > 0) printf("grandson2 id = %d. ",cid);
if(did == 0) printf("I'm the grandson2 process ");
}
else printf("Fork returned erro code,no child ");
pid_t cid,did;
printf("Just One process so far ");
printf("Calling fork... ");
pid = fork();
if(pid == 0)...{
printf("I'm the child. ");
cid = fork();
if(cid > 0) printf("grandson1 id = %d. ",cid);
if(cid == 0) printf("I'm the grandson1 process ");
}
else if(pid > 0) ...{
printf("I'm the parent ,child has pid %d ",pid);
did = fork();
if(did > 0) printf("grandson2 id = %d. ",cid);
if(did == 0) printf("I'm the grandson2 process ");
}
else printf("Fork returned erro code,no child ");
使用exec运行新程序:
所有exec函数族都完成同一功能:装载一个新的程序,并将之转换到调用进程的内存空间。如果调用成功,调用程序将被新的程序覆盖,并且从新程序的起始处开始运行,并保持与原调用进程相同的进程id。
printf("executing ls ");
execl("/bin/ls","ls","-1",(char*)0);
perror("execl failed to run ls");
exit(1);
execl("/bin/ls","ls","-1",(char*)0);
perror("execl failed to run ls");
exit(1);
本例中,在成功调用execl之后,调用进程被覆盖,所以就不执行perror,由此可知,当execl和相关调用返回时,它们通常返回-1。
将exec和fork一起使用:
pid_t pid;
switch(pid=fork())...{
case -1:
fatal("fork failed");
break;
case 0:
execl("/bin/ls","ls","-1",(char*)0);
fatal("exec failed");
break;
default:
wait((int*)0);
printf("is completed ");
break;
}
switch(pid=fork())...{
case -1:
fatal("fork failed");
break;
case 0:
execl("/bin/ls","ls","-1",(char*)0);
fatal("exec failed");
break;
default:
wait((int*)0);
printf("is completed ");
break;
}
- UNIX系统编程笔记
- Unix系统编程
- UNIX系统编程1
- unix系统编程2
- unix/linux系统编程
- Unix系统编程概述
- 《UNIX系统编程》
- linux/unix系统编程
- 读书笔记-UNIX系统编程第一章
- UNIX系统编程1《笔记》
- UNIX系统编程2《笔记》
- UNIX系统编程(1)
- UNIX系统编程(2)
- Unix/Linux系统网络编程
- Unix系统编程(2) - 文件系统
- Unix系统编程(3) - 进程
- 系统学习Unix网络编程
- Linux系统编程:Unix体系结构
- 10年内两类必被淘汰的企业软件开发公司
- 如何使用小红点
- 注册C函数与类成员函数到lua
- 利用C#实现分布式数据库查询
- 中国软件输在哪里?
- Unix系统编程
- Tiles配置问题
- 四看软件服务
- ATL和COM技术!求教高手
- java程序打包成JAR问题小结
- 关于科技创新6 On Technology Innovation 6
- 标准模版库中的容器
- 在 READ ONLY 游标上不能指定 FOR UPDATE的解决办法。给此游标的基础表加上主键。
- 可免费分发的Oracle小巧客户端:Oracle Instant Client 10.2.0.3