DDR爱好者之家 Design By 杰米

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的例子:   

/*execl的例子*/
#include <stdio.h>
#include <unistd.h>

main(){
  printf("Excuting ls\n");
  execl("/bin/ls", "ls", "-l", NULL);
  /*如果execl返回,说明调用失败*/
  perror("execl failed to run ls");
  exit(1);
}

/*execv的例子*/
#include <stdio.h>
#include <unistd.h>

main(){
  char *cmd[]={"ls", "-l", NULL};
  execv("/bin/ls", cmd);
  perror("execv failed");
  exit(1);
}

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

exec和fork()的联用

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

#include <stdio.h>
#include <unistd.h>

main(){
  int pid;
  /*fork子进程*/
  pid = fork();
  switch(pid){
    case -1:
      perror("fork failed.");
      exit(1);
    case 0:
      execl("/bin/ls", "ls", "-l", NULL);
      perror("execl failed.");
      exit(1);
    default:
      wait(NULL);
      printf("ls completed.\n");
      exit(0);
  }
}

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

 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

DDR爱好者之家 Design By 杰米
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
DDR爱好者之家 Design By 杰米

《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线

暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。

艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。

《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。