Linux编程 函数和进程操作
来源:互联网 发布:安卓端口映射软件 编辑:程序博客网 时间:2024/06/05 21:07
1,linux进程操作
1.1 函数system
【调用fork】
system()会调用fork()产生子进程,由子进程来调用/bin/sh -c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。、
1,其中只有execve是真正意义上的系统调用,其它都是在此基础上经过包装的库函数。
执行替换后不再返回到原程序。
常用程序结构:
结果如下显示:
这就跟printf的缓冲机制有关了,printf某些内容时,操作系统仅仅是把该内容放到了stdout的缓冲队列里了,并没有实际的写到屏幕上。但是,只要看到有/n 则会立即刷新stdout,因此就马上能够打印了。
运行了printf("fork!")后,“fork!”仅仅被放到了缓冲里,程序运行到fork时缓冲里面的“fork!” 被子进程复制过去了。因此在子进程度stdout缓冲里面就也有了fork! 。所以,你最终看到的会是fork! 被printf了2次!!!!
而运行printf("fork! /n")后,“fork!”被立即打印到了屏幕上,之后fork到的子进程里的stdout缓冲里不会有fork! 内容。因此你看到的结果会是fork! 被printf了1次!!!!
如果没有_exit(0)的话,子进程没有调用exec 或exit,所以父进程是不可能执行的,在子进程调用exec 或exit 之后父进程才可能被调度运行。下面就来讲下exit和_exit的区别。当调用exit(0)以后,系统会清洗缓冲区,并且关闭全部的标准I/O流。而调用_exit(0)后缓冲区冲不冲洗得看具体实现,在UNIX系统中,是不清洗的。
结果:
网上抄的一段,可以再理解理解:
为什么会有vfork,因为以前的fork 很傻, 它创建一个子进程时,将会创建一个新的地址空间,并且拷贝父进程的资源,而往往在子进程中会执行exec 调用,这样,前面的拷贝工作就是白费力气了,这种情况下,聪明的人就想出了vfork,它产生的子进程刚开始暂时与
父进程共享地址空间(其实就是线程的概念了),因为这时候子进程在父进程的地址空间中运行,所以子进程不能进行写操作,并且在儿子 霸占”着老子的房子时候,要委屈老子一下了,让他在外面歇着(阻塞),一旦儿子执行了exec 或者exit 后,相 于儿子买了自己的房子了,这时候就相 于分家了。
进程一旦调用了wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。如果成功,wait会返回被收集的子进程的进程ID,如果调用进程没有子进程,调用就会失败,此时wait返回-1,同时errno被置为ECHILD。
常用结构:
WNOHANG表示非阻塞调用。
1.2 函数exec
【替换进程映像】
exec家族一共有六个函数,分别是:
1,其中只有execve是真正意义上的系统调用,其它都是在此基础上经过包装的库函数。
2,几个字母:
"l"代表 list即表示以list形式给出,但最后要加一个空指针,如果用常数0来表示空指针,则必须将它强行转换成字符指针,否则有可能出错。
"v"代表 vector即矢量,
"p"代表通过PATH环境变量来查找新程序的可执行文件路径,
"e"代表可以传入一个环境变量envp。
3,示例程序:
执行替换后不再返回到原程序。
1.3 函数fork
【复制进程映像】
http://blog.csdn.net/jason314/article/details/5640969
常用程序结构:
结果如下显示:
这就跟printf的缓冲机制有关了,printf某些内容时,操作系统仅仅是把该内容放到了stdout的缓冲队列里了,并没有实际的写到屏幕上。但是,只要看到有/n 则会立即刷新stdout,因此就马上能够打印了。
运行了printf("fork!")后,“fork!”仅仅被放到了缓冲里,程序运行到fork时缓冲里面的“fork!” 被子进程复制过去了。因此在子进程度stdout缓冲里面就也有了fork! 。所以,你最终看到的会是fork! 被printf了2次!!!!
而运行printf("fork! /n")后,“fork!”被立即打印到了屏幕上,之后fork到的子进程里的stdout缓冲里不会有fork! 内容。因此你看到的结果会是fork! 被printf了1次!!!!
1.4 函数vfork
vfork创建新进程的主要目的在于用exec函数执行另外的程序,实际上,在没调用exec或exit之前子进程的运行中是与父进程共享数据段的。在vfork调用中,子进程先运行,父进程挂起,直到子进程调用exec或exit,在这以后,父子进程的执行顺序不再有限制。
fork与vfork的区别:
如果没有_exit(0)的话,子进程没有调用exec 或exit,所以父进程是不可能执行的,在子进程调用exec 或exit 之后父进程才可能被调度运行。下面就来讲下exit和_exit的区别。当调用exit(0)以后,系统会清洗缓冲区,并且关闭全部的标准I/O流。而调用_exit(0)后缓冲区冲不冲洗得看具体实现,在UNIX系统中,是不清洗的。
结果:
网上抄的一段,可以再理解理解:
为什么会有vfork,因为以前的fork 很傻, 它创建一个子进程时,将会创建一个新的地址空间,并且拷贝父进程的资源,而往往在子进程中会执行exec 调用,这样,前面的拷贝工作就是白费力气了,这种情况下,聪明的人就想出了vfork,它产生的子进程刚开始暂时与
父进程共享地址空间(其实就是线程的概念了),因为这时候子进程在父进程的地址空间中运行,所以子进程不能进行写操作,并且在儿子 霸占”着老子的房子时候,要委屈老子一下了,让他在外面歇着(阻塞),一旦儿子执行了exec 或者exit 后,相 于儿子买了自己的房子了,这时候就相 于分家了。
1.5 函数wait
进程一旦调用了wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。如果成功,wait会返回被收集的子进程的进程ID,如果调用进程没有子进程,调用就会失败,此时wait返回-1,同时errno被置为ECHILD。
该函数我的理解是:为了避免出现僵尸进程(即父进程没有wait读取子进程的退出信息)
1.6 函数waitpid
常用结构:
WNOHANG表示非阻塞调用。
0 0
- Linux编程 函数和进程操作
- 【Linux编程】进程终止和exit函数
- Linux-C编程-进程操作
- linux C编程 进程操作
- Linux 下 操作进程环境变量的函数和指令
- Linux进程 -- exec函数操作
- linux进程组操作函数
- linux进程和线程编程
- linux进程和线程编程
- Linux进程和shell编程
- 【Linux编程】僵尸进程和孤儿进程
- Linux下的C语言编程——进程间通过signal函数通信简单操作
- linux c/c++ 编程之-----进程操作
- linux之进程详解与操作编程
- linux之守护进程与操作编程
- linux系统编程之进程(三):exec系列函数和system函数
- linux系统编程之进程(三):exec系列函数和system函数
- Linux编程之进程和线程编程
- Android 中的转场动画及兼容处理
- java关键字和标识符
- 设计模式之观察者模式
- 11g Rac 配置 Linux
- 【7】编译python时出现的错误
- Linux编程 函数和进程操作
- the gdb of the process of httpinspect to detect in snort2.9
- Java中成绩管理系统(增删查改)
- com.thoughtworks.xstream.XStream操作XML和java对象的一些用法
- Spring Boot学习记录(四)--问题记录
- Java异常处理机制
- 学习笔记之开篇【面向对象技术】
- MSP430 - G2553之串口操作
- lightoj1006【记忆化搜索(我是这么叫)】