fork和execl

来源:互联网 发布:联通数据关闭还走流量 编辑:程序博客网 时间:2024/06/06 00:05

此去经年,应是良辰好景虚设。便纵有,千种风情,更与何人说。——柳永《雨霖铃》



最近在实现一个对开发板进行截屏的功能,其中用到了execl函数,下面就先介绍一下execl函数吧。execl函数用来执行某条命令。

execl函数包含于 #include <unistd.h>中,他是这样定义的:

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


第一个参数为命令的路径,一般在Linux下是/bin/xxx,然后第二个参数为命令的名称,接下来的参数则为执行这个命令的参数,这样说有点抽象,现在举个实例把:

比如我要使用cp这个命令,即我写一个函数,里面用到了execl函数,然后我调用这个函数,这个函数就会使用cp出我要的东西来原命令是:cp xxx.c  /led/

则:execl("/bin/cp", "cp", "xxx.c", "/led/", NULL ); 最后一个参数必须为NULL,用来说明参数用完了,否则将会出问题。


再来一个带参数的命令: rm -rf xxx.c,这个命令是删除某个目录,需要“-rf”这两个参数,则:execl("/bin/rm", "-rf", "xxx.c", NULL); 这里的“-rf”可以分成"-r"和"-f"。


但是execl这个函数一旦执行,就会把进程递交给我们的命令,下面的代码就会被丢弃,不会再用了,因此,我们需要创建子进程来完成这件事,这样我们的父进程,也就是主函数就可以继续做下面的事,不会被分心了。下面就来讲讲fork

在看linux高级环境编程时没有充分地理解这个东西,现在根据网上的资料结合书上的知识来整理一下。


一个现有的进程可以调用fork函数来创建一个新的进程:

#include <unistd.h>pid_t fork(void);    //pid_t是一种进程号的数据类型


这个新的进程被称为子进程,函数返回值的情况如下:

子进程返回0:因为一个进程只有一个父进程,因此子进程总可以调用getppid获得父进程的进程ID(进程ID 0由内核交换进程使用。因此一个子进程的ID不可能为0)。

父进程返回子进程ID:一个进程的子进程可以有多个,没有一个函数使一个进程可以获得其所有子进程ID。

当然,这是官方的解释,我个人的理解就是这是我们的系统规定的,哈哈,有点懵逼。

这就是fork函数调用的神奇之处,调用一次,却返回两次,还可能有三种不同的返回值。当然,记得添加出错返回。


为什么称为父子进程呢?不但是因为子进程由父进程创建,还因为父进程的所有值都复制到新的进程中,只有少数值与原来的进程不同,所以是父子进程嘛。

搞个程序来看看咯:

Copyright:  (C) 2017 minda *                  All rights reserved. * *       Filename:  fork.c *    Description:  This file  *                  *        Version:  1.0.0(05/01/2017) *         Author:  tangyanjun <519656780@qq.com> *      ChangeLog:  1, Release initial version on "05/01/2017 03:58:16 PM" *                  ********************************************************************************/#include <unistd.h>#include <stdio.h>int main(){    pid_t pid;    int count = 0;    pid = fork();    if (pid < 0)    {        printf("forking failed!\n");    }    else if (pid == 0)    {        printf("yo:%d\n", getpid());        printf("a\n");        count++;    }    else    {        printf("ha:%d\n", getpid());        printf("A\n");        count++;    }    printf("result is:%d\n",count);    return 0;}


输出结果:


大家可以看见,他输出了两次,pid为0的时候返回的是子进程,所以yo为子进程,而ha为父进程,在执行这两次程序时,父子程序之间是没有顺序的。



1 0
原创粉丝点击