1,进程创建方式🔗
  • system 系统调用shell
  • fork 创建和父进程一样的进程拷贝
  • exec 创建一个新的进程,与父进程不同
2,得到pid、和ppid🔗
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main(void)
{
    printf("pid = %d\n",getpid());
    printf("pid = %d\n",getppid());

    return EXIT_SUCESS;
}
3,获取当前用户信息🔗
/*getlogin函数返回执行程序的登陆用户名
getpwnam函数可以返回/etc/passwd文件中与该登录名相关的完整一行
#include <pwd.h>
struct passwd *getpwnam(const char *name);*/

/*例子*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <pwd.h>

int main()
{
    char * login = getlogin();
    struct passwd *ps = getpwnam(login);
    printf("user name=%s\n",ps->pw_name);
    printf("uid=%s\n",ps->pw_uid);
    printf("home dir=%s\n",ps->pw_dir);

    return EXIT_SUCESS;
}
4,system 系统调用🔗

system (“ls -l”);

5,fork 系统调用🔗
#include <unistd.h>
pid_t fork(void)
//fork 执行成功,想父进程返回子进程的pid,并向子进程返回
0,这意味着fork即使只调用一次,也会返回两次
//fork创建的新进程是和父进程(除pid和ppid)一样的副本
//父进程和子进程有点区别,子进程没有继承父进程的超时设置
(使用alarm调用)、父进程创建的文件锁,或者未决信号
//fork 失败返回 -1
6,exec命令族🔗
int main()
{
    char * args[] = {"/bin/ls","-l",NULL};
    execve("/bin/ls",args, NULL);

    printf("End\n");//不会执行,进程内容被execve覆盖

}
7,wait()、waitpid()可以收集子进程的退出状态🔗
/*
#include <sys/wait.h>
pid_t wait(int * status);
pid_t waitpid(pid_t pid,int * status,int options);
//status 保存子进程退出状态
//pid为等待进程的pid,他能接受下表列出4种值的一个
值           描述
-1          等待任何PGID等于PID 的绝对值子进程
1           等待任何子进程
0           等待任何PGID等于调用进程的子进程
>0          等待PID等于pid的子进程
*/

/*例子*/
#include <sys/wait.h>
#include <sys/types.h>
int main()
{
    pid_t pid = fork();
    int status;
    if(pid == -1)
    {
        printf("fork failed\n");
        return -1;
    }

    if(pid == 0)
    {
        printf("child process start\n");
        sleep(2);
        printf("child process start\n");
        return 100;

    }
    else
    {
        printf("parent process start\n");
        wait(&status);
        //等待子进程退出,并获得状态,不能搜集多个子进程
        //waitpid(pid,&status,0);
        //等待子进程退出,并获得状态,能搜集多个子进程
        printf("status %d\n",WEXITSTATUS(status));//用宏去解析这个状态
        printf("parent process start\n");
        return 0;

    }

}

//僵死进程 父进程没有调用wait,子进程就退出了,这个时候子进程就成了僵死进程

//孤儿进程 父进程在调用wait()或者waitpid()之前就已经退出的进程,叫做孤儿进程,此时init 成为此进程的父进程,由父进程收集孤儿进程的退出状态,避免其僵死

8、结束进程🔗

5种退出原因 - main 中调用return - 调用exit函数,int exit(int status)返回状态值,用于非main函数中退出子进程 - 调用_exit函数 - 调用abort函数,void abort(void)导致程序异常终止,产生core文件 - 被一个信号终止

kill函数
#include <signal.h>
#include <sys/types.h>
int kill(pid_t pid,int sig)
//exit,abort用来杀死自己
//kill函数用来杀死另一个进程
//参数pid指定一个要杀死的进程,sig指发送的信号

备份地址: 【Linux进程控制