当前位置: 技术问答>linux和unix
关于linux下创建进程的几个疑问
来源: 互联网 发布时间:2016-05-09
本文导语: 刚接触到linux下这几方面编程的问题请教一下大家: (请允许我用Windows下的实现方式表达我对Linux下该如何做的疑问) 1. 如何在一个进程启动另外一个进程,分两种情况,一种是:新启动的进程和当前进程并行一起...
刚接触到linux下这几方面编程的问题请教一下大家:
(请允许我用Windows下的实现方式表达我对Linux下该如何做的疑问)
1. 如何在一个进程启动另外一个进程,分两种情况,一种是:新启动的进程和当前进程并行一起跑;另一种是:当前进程等待新启动进程结束?当是后者的情况下,如何获得新启动进程的退出状态?
(windows下第一个情况直接用CreateProcess即可,第二种情况使用CreateProcess之后WaitForSingleObject等待进程句柄即可,进程的退出状态可以通过GetExitCode函数获得)
2. 如何在创建进程的时候指定该进程的工作目录?
(windows下使用CreateProcess可以指定工作路径)
注:目前已经阅读的linux API包括如下:system() 函数,exec系列函数,fork系列函数,均无法完全满足上述三个情况。
(请允许我用Windows下的实现方式表达我对Linux下该如何做的疑问)
1. 如何在一个进程启动另外一个进程,分两种情况,一种是:新启动的进程和当前进程并行一起跑;另一种是:当前进程等待新启动进程结束?当是后者的情况下,如何获得新启动进程的退出状态?
(windows下第一个情况直接用CreateProcess即可,第二种情况使用CreateProcess之后WaitForSingleObject等待进程句柄即可,进程的退出状态可以通过GetExitCode函数获得)
2. 如何在创建进程的时候指定该进程的工作目录?
(windows下使用CreateProcess可以指定工作路径)
注:目前已经阅读的linux API包括如下:system() 函数,exec系列函数,fork系列函数,均无法完全满足上述三个情况。
|
A先用fork复制自身,然后在新的子进程中用exec函数执行B
A中可以waitpid等待B执行完,也可以不用
|
可以通过进程Id
获取进程id函数:getpid()用来取得目前进程的进程识别码;
getppid()用来取得目前进程的父进程识别码。
wait(等待子进程中断或结束)
相关函数 waitpid,fork
表头文件 #include #include
定义函数 pid_t wait (int * status);
函数说明 wait()会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用wait()时子进程已经结束,则wait()会立即返回子进程结束状态值。子进程的结束状态值会由参数status 返回,而子进程的进程识别码也会一快返回。如果不在意结束状态值,则
参数 status可以设成NULL。子进程的结束状态值请参考waitpid()。
返回值 如果执行成功则返回子进程识别码(PID),如果有错误发生则返回-1。失败原因存于errno中。
附加说明
范例 #include
#include
#include
#include
main()
{
pid_t pid;
int status,i;
if(fork()= =0){
printf("This is the child process .pid =%dn",getpid());
exit(5);
}else{
sleep(1);
printf("This is the parent process ,wait for child...n";
pid=wait(&status);
i=WEXITSTATUS(status);
printf("child’s pid =%d .exit status=^dn",pid,i);
}
}
waitpid(等待子进程中断或结束)
相关函数 wait,fork
表头文件 #include #include
定义函数 pid_t waitpid(pid_t pid,int * status,int options);
函数说明 waitpid()会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用wait()时子进程已经结束,则wait()会立即返回子进程结束状态值。子进程的结束状态值会由参数status返回,而子进程的进程识别码也会一快返回。如果不在意结束状态值,则参数status可以设成NULL。参数pid为欲等待的子进程识别码,其他数值意义如下:
pid0 等待任何子进程识别码为pid的子进程。
参数option可以为0 或下面的OR 组合
WNOHANG 如果没有任何已经结束的子进程则马上返回,不予以等待。
WUNTRACED 如果子进程进入暂停执行情况则马上返回,但结束状态不予以理会。
子进程的结束状态返回后存于status,底下有几个宏可判别结束情况
WIFEXITED(status)如果子进程正常结束则为非0值。
WEXITSTATUS(status)取得子进程exit()返回的结束代码,一般会先用WIFEXITED 来判断是否正常结束才能使用此宏。
WIFSIGNALED(status)如果子进程是因为信号而结束则此宏值为真
WTERMSIG(status)取得子进程因信号而中止的信号代码,一般会先用WIFSIGNALED 来判断后才使用此宏。
WIFSTOPPED(status)如果子进程处于暂停执行情况则此宏值为真。一般只有使用WUNTRACED 时才会有此情况。
WSTOPSIG(status)取得引发子进程暂停的信号代码,一般会先用WIFSTOPPED 来判断后才使用此宏。
返回值 如果执行成功则返回子进程识别码(PID),如果有错误发生则返回-1。失败原因存于errno中。
获取进程id函数:getpid()用来取得目前进程的进程识别码;
getppid()用来取得目前进程的父进程识别码。
wait(等待子进程中断或结束)
相关函数 waitpid,fork
表头文件 #include #include
定义函数 pid_t wait (int * status);
函数说明 wait()会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用wait()时子进程已经结束,则wait()会立即返回子进程结束状态值。子进程的结束状态值会由参数status 返回,而子进程的进程识别码也会一快返回。如果不在意结束状态值,则
参数 status可以设成NULL。子进程的结束状态值请参考waitpid()。
返回值 如果执行成功则返回子进程识别码(PID),如果有错误发生则返回-1。失败原因存于errno中。
附加说明
范例 #include
#include
#include
#include
main()
{
pid_t pid;
int status,i;
if(fork()= =0){
printf("This is the child process .pid =%dn",getpid());
exit(5);
}else{
sleep(1);
printf("This is the parent process ,wait for child...n";
pid=wait(&status);
i=WEXITSTATUS(status);
printf("child’s pid =%d .exit status=^dn",pid,i);
}
}
waitpid(等待子进程中断或结束)
相关函数 wait,fork
表头文件 #include #include
定义函数 pid_t waitpid(pid_t pid,int * status,int options);
函数说明 waitpid()会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用wait()时子进程已经结束,则wait()会立即返回子进程结束状态值。子进程的结束状态值会由参数status返回,而子进程的进程识别码也会一快返回。如果不在意结束状态值,则参数status可以设成NULL。参数pid为欲等待的子进程识别码,其他数值意义如下:
pid0 等待任何子进程识别码为pid的子进程。
参数option可以为0 或下面的OR 组合
WNOHANG 如果没有任何已经结束的子进程则马上返回,不予以等待。
WUNTRACED 如果子进程进入暂停执行情况则马上返回,但结束状态不予以理会。
子进程的结束状态返回后存于status,底下有几个宏可判别结束情况
WIFEXITED(status)如果子进程正常结束则为非0值。
WEXITSTATUS(status)取得子进程exit()返回的结束代码,一般会先用WIFEXITED 来判断是否正常结束才能使用此宏。
WIFSIGNALED(status)如果子进程是因为信号而结束则此宏值为真
WTERMSIG(status)取得子进程因信号而中止的信号代码,一般会先用WIFSIGNALED 来判断后才使用此宏。
WIFSTOPPED(status)如果子进程处于暂停执行情况则此宏值为真。一般只有使用WUNTRACED 时才会有此情况。
WSTOPSIG(status)取得引发子进程暂停的信号代码,一般会先用WIFSTOPPED 来判断后才使用此宏。
返回值 如果执行成功则返回子进程识别码(PID),如果有错误发生则返回-1。失败原因存于errno中。