Linux 进程基础

传统的Linux模型里有三种创建或者修改进程的操作
--system用于调用shell,执行一个指定的命令;
--fork用于创建一个新的进程,该进程几乎是当前进程的一个完全拷贝;
--exec可以在进程中用另外的程序来替换当前运行的进程。

 

进程
进程是一个正在执行的程序实例,他也是Linux基本的调度单位,一个进程由如下元素组成
--进程的当前上下文(context),他是进程当前执行状态;
--进程的当前执行目录;
--进程访问的文件和目录;
--程序的访问权限;
--内存和其他分配给进程的系统资源;

 

进程标识号
--进程最知名的属性就是进程号(processID,PID)和它父进程号(parent processID,PPID).
--PID和PPID都是非零的整数
--一个PID唯一标识一个进程。
--一个进程创建的另一个新进程称为子进程。相反的,创建子进程的进程称为父进程。
--所有进程追溯其祖先最终都会落到进程号为1的进程身上,这个进程叫init进程
  -init进程是linux内核启动后第一个执行的程序。
  -init引导系统,启动守护进程并且运行必要的程序。

 

获取PID和PPID
pid_t getpid(void);
pid_t getppid(void);

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>

int main(int arg, char * args[])
{
    printf("pid=%d\n",getpid());
    printf("ppid=%d\n",getppid());
    return 0;
}

 

getlogin函数返回执行程序的用户登录名。
可以把登录名作为参数传递给getpwnam函数,这个函数能返回/etc/passwd文件中与该登录名相应的一行完成信息。
struct passwd *getpwnam(const char *name);
name必须是一个指向包含用户名的字符串指针。
getpwnam返回一个指向passwd结构体的指针。

 

struct passwd {
               char   *pw_name;       /* username */
               char   *pw_passwd;     /* user password */
               uid_t   pw_uid;        /* user ID */
               gid_t   pw_gid;        /* group ID */
               char   *pw_gecos;      /* real name */
               char   *pw_dir;        /* home directory */
               char   *pw_shell;      /* shell program */
           };

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>

int main(int arg, char * args[])
{
    //返回当前登录用户的属主名
    char * login=getlogin();
    printf("%s\n",login);
    struct passwd * ps=getpwnam(login);
    printf("user name:%s\n",ps->pw_name);
    //无法返回正确的用户密码
    printf("user password:%s\n",ps->pw_passwd);
    printf("user ID:%d\n",ps->pw_uid);
    //返回属主目录
    printf("home directory:%s\n",ps->pw_dir);

    return 0;
}

 

posted on 2016-08-25 21:35  寒魔影  阅读(370)  评论(0编辑  收藏  举报

导航