此去经年,应是良辰好景虚设。便纵有,千种风情,更与何人说。——柳永《雨霖铃》
最近在实现一个对开发板进行截屏的功能,其中用到了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为父进程,在执行这两次程序时,父子程序之间是没有顺序的。