zoukankan      html  css  js  c++  java
  • Linux进程控制

    常用函数:

    • fork() 通过复制调用进程来建立新的进程,是最基本的进程建立操作。
    • exec   包括一系列的系统调用,其中每个系统调用都完成相同的功能,即通过用一个新的程序覆盖原内存空间,来实现进程的转变。各种exec系统调用之间的区别仅在于它们的参数构造不同。
    • wait() 它提供了初级的进程同步措施,能使一个进程等待,直到另一个进程结束为止。
    • exit()  常用来终止一个进程的运行。

    进程的建立

      如果fork()调用成功,就会使内核建立一个新的进程,所建的新进程是调用fork()进程的副本。也就是说,新的进程运行与其创建者一样的程序,其中的变量具有与创建进程变量相同的值。

      系统调用fork()没有参数,它返回一个pid_t类型的值pid。pid被用来区分父进程和子进程。在父进程中pid被置为一个非0的正整数;在子进程中,pid被置为0。

    进程的运行

      exec系列调用:

      int execl(const char* path, const char *arg, ...);

      int execlp(const char * file, const char *arg, ...);

      int execle(const char *path, const char *arg, ..., char * const envp[]);

      int execv(const char* path, char *const argv[]);

      int execvp(const char* file, char * const argv[]);

      由于参数的个数是任意的,所以必须用一个null指针来标记参数表的结尾。下面给出一个使用execl()和execv()调用来运行ls的例子:   

     1 /*execl的例子*/
     2 #include <stdio.h>
     3 #include <unistd.h>
     4 
     5 main(){
     6     printf("Excuting ls\n");
     7     execl("/bin/ls", "ls", "-l", NULL);
     8     /*如果execl返回,说明调用失败*/
     9     perror("execl failed to run ls");
    10     exit(1);
    11 }
    12 
    13 /*execv的例子*/
    14 #include <stdio.h>
    15 #include <unistd.h>
    16 
    17 main(){
    18     char *cmd[]={"ls", "-l", NULL};
    19     execv("/bin/ls", cmd);
    20     perror("execv failed");
    21     exit(1);
    22 }

    系统调用execlp()和execvp()分别类似于系统调用execl()和execv(),它们的主要区别是:execlp()和execvp()的第一个参数指向的是一个简单的文件名,而不是一个路径名。它们通过检索shell环境变量PATH指出的目录,来得到该文件名的路径前缀部分。

    exec和fork()的联用

      通过联用可以实现父进程运行一个与其不同的子进程,并且父进程不会被覆盖。下面给出一个 exec和fork()联用的例子:  

     1 #include <stdio.h>
     2 #include  <unistd.h>
     3 
     4 main(){
     5     int pid;
     6     /*fork子进程*/
     7     pid = fork();
     8     switch(pid){
     9         case -1:
    10             perror("fork failed.");
    11             exit(1);
    12         case 0:
    13             execl("/bin/ls", "ls", "-l", NULL);
    14             perror("execl failed.");
    15             exit(1);
    16         default:
    17             wait(NULL);
    18             printf("ls completed.\n");
    19             exit(0);
    20     }
    21 }

      在fork()调用之前,只有一个进程A,fork()调用后就有了进程A和B。A是父进程,它正在执行系统调用wait(),使进程A睡眠,直至进程B结束。同时进程B正在用execl装入命令ls。exec调用后,进程B的程序被ls的代码取代,执行ls命令的代码。

  • 相关阅读:
    字典列表元组的推导式使用方法
    算法之排序
    闭包与装饰器
    循环(打印一些小东西)
    iOS内存小知识
    NSset
    字典
    NSNumber
    NSString
    NSArray
  • 原文地址:https://www.cnblogs.com/goodhacker/p/3077190.html
Copyright © 2011-2022 走看看