fork和execl

本文介绍如何在Linux环境下利用execl函数执行命令,并通过fork函数创建子进程以保持父进程运行。详细解析了execl函数的工作原理及其实现截图功能的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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



最近在实现一个对开发板进行截屏的功能,其中用到了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为父进程,在执行这两次程序时,父子程序之间是没有顺序的。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值