Linux进程部分笔记

5 篇文章 0 订阅
4 篇文章 0 订阅

Linux进程笔记

1.什么是程序,什么是进程,有什么区别

** 程序是静态的概念,gcc xxx.c –o pro磁盘中生成pro文件,叫做程序。进程是程序的一次运行活动,通俗点意思是程序跑起来了,系统中就多了一个进程**

2. 如何查看系统中有哪些进程?

** 使用指令 ps - aux可以查看所有进程
使用 ps -aux|grep *** ,可以只查找想要的进程
**

3.什么是进程标识符

** 每个进程都有一个非负整数表示的唯一ID,
叫做pid,类似身份证。利用getpid()可以获取自身的进程标识符
利用getppid()获取父进程的进程标识符。
**

4.什么叫父进程,什么叫子进程

** 进程A创建了进程B那么A叫做父进程,B叫做子进程,父子进程是相对的概念,理解为人类中的父子关系
**

5.c程序的存储空间是如何分配的

** 有代码段,数据段(初始化数据段和未初始化数据段),堆,栈,命令行参数和环境变量
**

fork函数介绍

所需头文件和函数原型

 	#include <unistd.h>
    pid_t fork(void);

fork函数调用成功(创建父子进程,pid不相同),返回两次
返回值为0, 代表当前进程是子进程
返回值非负数,代表当前进程为父进程

调用失败,返回-1
下面例子证明,运行结果这里就不展示了(头文件自己加)

int main()
{
        pid_t retpid;
        retpid = fork();
        if(retpid > 0){
                printf("this is father print,retpid = %d\n\n",retpid);
        }
        else if(retpid == 0){
                printf("this is child,child retpid = %d\n",retpid);
        }
        
        return 0;
}

fork函数:
1、fork()是创建进程函数。

2、c程序一开始,就会产生 一个进程,当这个进程执行到fork()的时候,会创建一个子进程。

3、此时父进程和子进程是共存的,它们俩会一起向下执行c程序的代码。

4、需要注意!!!子进程创建成功后,fork是返回两个值,一个代表父进程,一个代表子进程:代表父进程的值是一串数字,这串数字是子进程的ID;一个代表子进程,值为0。

vfork函数介绍

vfork函数 也可以创建进程,与fork的区别

1.vfork直接使用父进程的存储空间,不拷贝
2.vfork保证子进程先运行,当子进程调用exit()退出后父进程才执行。

父进程等待子进程退出(是否收集子进程退出状态)

1.子进程退出状态不被收集,则会变成Z+(僵尸进程)
2.调用wait函数,收集子进程退出状态

	   #include <sys/types.h>
       #include <sys/wait.h>

       	pid_t wait(int *status);

 	 wait(&status);
     printf("child quit,child status = %d \n",WEXITSTATUS(status));

该printf输出的值为子进程中exit()的参数。
在调用wait()等待子进程的时间里,父进程处于阻塞状态,当调用waitpid()等待子进程的退出状态时,父进程不阻塞

孤儿进程

父进程如果不等待子进程退出,在子进程之前就结束了自己的“生命”,此时子进程叫做孤儿进程。
Linux避免系统存在过多孤儿进程,initinit进程id号为1,详细介绍请点击进程收留孤儿进程,变成孤儿进程的父进程。

exec族函数

exec族函数函数的作用:
我们用fork函数创建新进程后,经常会在新进程中调用exec函数去执行另外一个程序。当进程调用exec函数时,该进程被完全替换为新程序。因为调用exec函数并不创建新进程,所以前后进程的ID并没有改变。
返回值:
  exec函数族的函数执行成功后不会返回,调用失败时,会设置errno并返回-1,然后从原程序的调用点接着往下执行。

	execl("./echoarg","echoarg","aaa",NULL);

#include <stdio.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
        printf("before execl\n");
        if(execl("/bin/ls","ls","-l",NULL) == -1){
                printf("execl error\n");
                perror("why");
        }
        printf("after execl\n");
        return 0;
}

execl和execlp的区别

execlp可以自动寻找可执行文件的地址。

popen

1.简介
创建一个管道,然后再创建一个进程。然后执行命令

2.调用格式
#include <stdio.h>
FILE *popen(const char *command, const char *type);
3.参数介绍
command:是一个指向以NULL结束的shell命令字符串的指针。这行命令将被传到/bin/sh并使用 -c标志,shell将执行这个命令
type:只能是只读或只写中的一种,得到的返回值(标准I/O流)也具有和type相应的只读或只写类型。如果type是"r",则文件指针连接到command的标准输出;如果type是"w",则文件指针连接到command的标准输入
例子:

#include <stdio.h>
#include <string.h>
int main(void)
{
    FILE *fp = NULL;
    char buf[10240] = {0};
    fp = popen("ls","r");
    if(fp == NULL){
        return 0;
    }
    fread(buf, 10240, 1, fp);
    printf("%s\n",buf);
    pclose(fp);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值