分享

Linux进程

 sky_feiyang 2015-05-04
获得进程ID: 
#include<sys/types.h>
#include<unistd.h>
pid_t   getpid(void)   //pid_t是一个int型

Linux是复制进程而不是创建进程,有两个函数fork()和clone(),区别是前者是全部复制,后者是选择复制。fork()和vfork()的区别是前者是全部复制,后者是只复制task_struct和系统堆栈。即前者是独立的内存,后者是共享的内存。

fork():
 #include<sys/types.h>
 #include<unistd.h>
 pit_t   fork(void)
若创建成功,在父进程中返回子进程ID,在子进程中返回0。若出错则返回-1。
fork之后,子进程和父进程都从调用fork函数的下一条语句开始执行。

如下代码:
pid_t   pid=fork();
if(pid==-1) //出错
{
printf("Error in fork!");   exit(1);
}
else   if(pid==0)
{
                //子进程中;
}
else   //父进程中

大部分复制出来的进程一定会与父进程分道扬镳,执行自己的程序。那么就要使用exec函数族其中包括了execl、execlp、execle、execv、execvp、execve 6个函数。

进程的消亡:
有两个方式:一种是自然退出,exit()和_exit()。第二种是异常终止,abort()。

exit():立刻终止,清除所有数据结构。
#include<stdlib.h>
void   exit(int status)

_exit():   #include<unistd.h>
void   _exit(int status)

区别:exit()会首先执行一些文件关闭操作

进程调用了exit和_exit之后并非立刻消失,而是留下一个僵尸进程的数据结构,可以用wait和waitpid来处理。
#include<sys/types.h>
#include<sys/wait.h>
pid_t   wait(int* status)
status用来收集进程退出的状态(若不需要则置为NULL),若成功则返回等待进程的ID,若失败则返回-1。
进程一旦调用了wait,会立即阻塞自己。由wait自动分析是否当前进程的某个子进程已经退出,如果让他找到这样的一个已经变成僵尸进程的子进程,wait就会手机这个子进程的信息,并把它彻底销毁后返回,如果没有找到这样的一个子进程,则wait会一直阻塞在这里,知道出现一个为止。
如下代码:
pid_t   pid=fork();
if(pid==-1) //出错
{
printf("Error in fork!");   exit(1);
}
else   if(pid==0)
{
                //子进程中;
}
else   
{
pid_t   pWait=wait(NULL);   //等待子进程
}

waitpid: #include<sys/types.h>
#include<sys/wait.h>
pid_t   waitpid(pid_t pid,int* status,int options)

pid取值                                                                             含义

pid>0 只等待进程ID为pid的子进程,不管其他已经有多少子进程运行  结束退出,只                                 要指定的子进程还没有结束,则waitpid就一直等待下去。

pid=-1 等待任何一个子进程退出,没有任何限制,此时等价于wait

pid=0 等待同一个进程组中的任何子进程,如果某一个子进程已经加入了别的进程   组,则waitpid不会对它有任何理睬

pid<-1 等待一个定制进程组中的任何子进程,这个进程组的ID等于pid的绝对值

options目前只支持WNOHANG和WUNTRACED两个选项

如下代码:
pid_t   pid=fork();
if(pid==-1) //出错
{
printf("Error in fork!");   exit(1);
}
else   if(pid==0)
{
                //子进程中;
}
else   
{
pid_t   pWait=waitpid(pid,NULL,WNOHANG);   
//参数WNOHANG表示不会等待子进程,若没有已退出的子进程则直接返回0
}

abort():会产生一个core dumped文件
#include<stdlib.h>
void   abort(void)

system():   #include<stdlib.h>
   int system(const char* cmdstring)

执行system时会调用fork、exec、waitpid,因此有三种可能的返回值。
-1        fork失败或者waitpid返回出来EINTR之外的错误
127        exec失败
若都成功则返回shell的终止状态

若cmdstring为NULL则表示仅当命令处理程序可用时返回非0。可用于测试给定的操作系统上是否支持system函数。























































    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多