Linux 进程控制--- 编程 --- getpid --- fork --- exec --- system --- wait

来源:互联网 发布:亚索腥红之月皮肤 知乎 编辑:程序博客网 时间:2024/05/16 11:00

获取 ID -  getpid 

          #include < sys/types.h >

          #include < unistd.h >

          pid_t  getpid ( void )  

          获取本进程 ID .

          pid_t  getppid ( void )

          获取父进程 ID .

进程创建-  fork:

          #include < unistd.h >

          pid_t  fork ( void )

          功能:创建子进程.

          fork 的奇妙之处在于它被调用一次,却返回两次,它可能有三种不同的返回值.

                    1,在父进程中,fork 返回新创建的子进程的 PID .

                    2,在子进程中,fork 返回0.

                    3,如果出现错误,fork 返回一次负值.

          在 pid = fork() 之前,只有一个进程在执行,但在这条语句执行之后,就变成两个进程在执行了,

          这两个进程共享代码段,两个进程中,原来就存在的那个进程被称作“父进程”,新出现的那个进程被

          称作“子进程”,父子进程的区别在于进程的标识符 ( PID ) 不同.


          pid_t  pid;

          count = 0;

          pid = fork();

          count++;

          printf ( "count = %d\n",count );

输出:

          count = 1;

          count  = 1;

          count ++ 被父子进程一共执行了两次,为什么 count 的第二次输出不为 2 ?

解释:

          子进程的数据空间,堆栈空间都会从父进程得到一个拷贝,而不是共享.

          在子进程进行加一操作并不会影响父进程.

进程创建-  vfork:

          #include < sys/types.h >

          #include < unistd.h >

          pid_t vfork (void)

          功能:创建子进程.

fork  区别  vfork:

          1,fork :子进程拷贝父进程的数据段.

                vfork:子进程共享父进程共享数据段.

          2,fork :父,子进程的执行次序不确定.

                vfork:子进程先运行,父进程后运行.

exec 函数族:

          exec 用于 被执行的程序 替换 调用它的程序

fork  区别 exec :

          fork 创建一个新的进程,产生一个新的 PID .

          exec  启动一个新程序,替换原有的进程,因此进程的 PID 不会改变.

exec 函数族- execl :

          函数: int execl (const char * path , const char * arg1 , ....)

          参数:

                    path :被执行程序名,需包含完整路径 .

                    arg1 - argn : 被执行程序所需的命令行参数,含程序名。以空指针( NULL )结束.

#include < unistd.h >int main(){    execl( "/bin/ls","ls","-al","/etc/passwd",(char *) 0);}

exec 函数族- execlp :

          函数:int  execlp ( const  char * path ,const char * arg1 , ...)

          参数:

                    path:被执行程序名,可以不含完整路径,将会从 path 环境变量中查找该程序 . 

                    arg1 - argn : 被执行程序所需的命令行参数,含程序名。以空指针( NULL )结束.

exec 函数族- execv:

          函数:int  execv ( const  char * path , char * argv[ ] )

          参数:

                    path:被执行程序名,需包含完整路径 .

                    argv[ ] :被执行程序所需的命令行参数数组 .

exec 函数族- system:

          函数:int  system ( const  char * string )    #include < stdlib.h >

          功能:

                    调用 fork 产生子进程,由子进程来调用 /bin/sh  -c string 来执行 参数 string 所代表的命令 .

          eg:system ( "ls -al /etc/passwd" );

进程等待 wait:

          函数:pid_t  wait ( int  * status )      #include < sys/wait.h >

          功能: 阻塞该进程,直到其 某个 子进程 退出 .



如果是子进程先运行,完成打印就睡眠,然后开始父进程,调用wait后,等待子进程的退出,10秒后,子进程退出,父进程打印.

如果是父进程先运行,调用wait后,等待子进程的退出,开始子进程,子进程完成打印就睡眠,10秒后,子进程退出,父进程打印.








原创粉丝点击