0
点赞
收藏
分享

微信扫一扫

[操作系统自由练习] 进程的创建, fork()函数

回望这一段人生 2022-04-23 阅读 67
linux

author: 泥烟


文章目录

ps命令查看系统进程

ps 的参数很多, 在此仅列出几个常用的参数

  • -A 列出所有的进程

  • -w 显示加宽可以显示较多的资讯

  • -ef 显示所有命令,连带命令行

  • -au 显示较详细的资讯

  • -aux 显示所有包含其他使用者的行程

  • au(x) 输出格式 :USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

    • USER: 行程拥有者

    • %CPU: 占用的 CPU 使用率

    • %MEM: 占用的记忆体使用率

    • VSZ: 占用的虚拟记忆体大小

    • RSS: 占用的记忆体大小

    • TTY: 终端的次要装置号码 (minor device number of tty)

    • STAT: 该行程的状态

  • kill -9 pid 杀死pid号的进程

  • env 查看环境变量

在这里插入图片描述

fork1.c

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

main()
{
    int pid=fork();
    if(pid == -1){
        printf("fork failed.\n");
        return ;
    }
    else if(pid > 0) printf("%d %d\n", pid, getpid());
    else printf("%d %d\n", pid, getpid());
    printf("child\n");
    printf("father\n");
    return;
}

在这里插入图片描述

总结

fork2.c

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

main(int argc, char **argv)
{
    int pid = fork();
    
    if(pid == 0){
        printf("Child\n");
        execl("/bin/ls", "ls", 0);
        perror("exce error!\n");
        printf("ccc");
    }
    else if(pid > 0) printf("Parent\n");
    else printf("FORK FAIL!\n");

    printf("%d END.\n", getpid());
}

在这里插入图片描述

总结

fork2plus.c (可传参)

#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>

main(int argc, char **argv)
{
    int pid = fork();
    int rtn;
    if(pid == 0){
        printf("Child\n");
        printf("argc=%d\n", argc);
        for(int i = 1; i < argc; i ++){
            printf("执行%s...\n", argv[i]);
            system(argv[i]);
            perror(argv[i]);
        }
        exit(errno);
    }
    else if(pid > 0){
        wait(&rtn);
        printf("Chird is over, here is parent(%d)\n", getpid());
    }
    else printf("FORK FAIL!\n");

    printf("%d END.\n", getpid());
}

在这里插入图片描述

总结

1.分析
2.argc argv

proc1.c

//进程操作
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
#include <errno.h>
int main(int argc,char **argv)
{
    pid_t pid,old_ppid,new_ppid;
    pid_t child,parent;
    parent = getpid();  //获得本进程PID
    if((child=fork()) < 0){
        fprintf(stderr, "%s:fork of child failed:%s\n", argv[0], strerror(errno));
        exit(1);
    }
    else if(child == 0){  //子进程被调度运行
        old_ppid = getppid();
        sleep(2);
        new_ppid = getppid();
    }
    else {
        sleep(2);
        printf("父亲(pid=%d)醒了并say good bye!\n", getpid());
        exit(0);          //父进程退出
    }
   //下面仅子进程运行
    printf("Original parent:%d\n", parent);
    printf("Child:%d\n", getpid());
    printf("Child's old ppid:%d\n", old_ppid);
    printf("Child's new ppid:%d\n", new_ppid);
    exit(0);
}

在这里插入图片描述

总结

举报

相关推荐

0 条评论