Linux应用 之 进程开辟

进程开辟就三个函数

首先是system:

int system(const char *string);

string:shell命令字符串
返回值:成功返回命令退出码,这个命令退出码就是各个程序自己的return 回来的那个码;如果无法启动shell,返回127错误码,其他错误,返回-1。

system函数,在启动新进程时,必须先启动shell进程,因此使用system函数的效率不高。system函数必须等待子进程返回才能接着执行。其实system函数很小,你也看过了,是阻塞模式,子模式执行时父进程是卡住的。

接下来是exec:

exec系列函数调用时,启动新进程,替换掉当前进程。即程序不会再返回到原进程,除非exec调用失败。
exec启动的新进程继承了原进程的许多特性,如在原进程中打开的文件描述符在新进程中仍保持打开。
需要注意的是,在原进程中打开的文件流在新进程中将关闭。原因在于,我们在前面讲过进程间通信的方式,进程之间需要管道才能通信。

int execl(const char *path,const char *arg0,...,(char*)0);
int execlp(const char *file,const char *arg0,...,(char*)0);
int execle(const char *path,const char *arg0,...,(char*)0,char *const envp[]);

int execv(cosnt char *path,char *const argv[]);
int execvp(cosnt char *file,char *const argv[]);
int execve(cosnt char *path,char *const argv[],char *const envp[]);

命令有这么多,大同小异,path/file:进程命令路径/进程命令名;argc:命令参数列表;envp:新进程的环境变量

不知道这个函数有什么存在的意义。。。既然替换掉原来的进程,干脆为嘛不写两个if呢?可能是为了实现接口吧!

fork和exec的替换不同,调用fork函数,可复制一个和父进程一模一样的子进程。老生常谈了。
执行的代码也完全相同,但子进程有自己的数据空间,环境和文件描述符。
原型:

pid_t fork();

父进程执行时,返回子进程的PID
子进程执行时,返回0

这样就可以用if区分开。。。也没有什么存在的意义嘛。。。关键就是二者的结合,这样,可以开辟出新的进程来,同时,也知道pid,因此还是蛮有可能进行通信的。

值得注意的是,子进程退出后,内核会将子进程置为僵尸状态。保留了一些最基本的结构,如pid和退出码,方便父进程收尸。

在父进程中调用wait或waitpid函数,查询子进程的退出状态,可以避免僵尸进程。原来它存在的意义就是收尸啊。。。

#include <sys/types.h>

#include <wait.h>

pid_t wait(int *stat_loc);
pid_t waitpid(pid_t pid,int *stat_loc,int options);

stat_loc:子进程的状态码会被写入该指针指向的位置,说白了就是接收返回值。如果不想要返回值,用NULL代替。
pid:等待的子进程的进程号pid
options:标记阻塞或非阻塞模式,这样它就可以设置了,wait函数是没办法设置的
返回值:成功返回子进程的pid,若子进程没有结束或意外终止,返回0

wait:阻塞模式(使用了信号量),父进程调用wait时,会暂停执行,等待子进程的结束。结束的时候就会返回pid,它可能就是只能开辟一个子进程。它就是等待任何一个子进程,这里比较复杂。
wait调用返回后,子进程会彻底销毁。一个进程只能用一次fork吧?。。。

waitpid:与wait不同的是,
a.可以表示四种不同的子进程类型
     pid==-1 等待任何一个子进程,此时waitpid的作用与wait相同
  pid >0 等待进程ID与pid值相同的子进程
  pid==0 等待与调用者进程组ID相同的任意子进程
  pid<-1 等待进程组ID与pid绝对值相等的任意子进程
b.当options的值为WNOHANG时,为非阻塞模式,即waitpid会立即返回,此时,可以循环查询子进程的状态,若子进程未结束,waitpid返回,做其他工作。这样提高了程序的效率。不是很明白,但是以后会用的。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值