Chinaunix首页 | 论坛 | 博客
  • 博客访问: 515085
  • 博文数量: 87
  • 博客积分: 4086
  • 博客等级: 上校
  • 技术积分: 900
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-23 15:55
文章分类

全部博文(87)

文章存档

2012年(3)

2010年(13)

2009年(7)

2008年(64)

我的朋友

分类: LINUX

2009-06-12 16:10:21

桌面系统中的ps命令可以查看进程。默认情况下,ps只显示当前终端和当前终端上所运行的进程,如果要查看系统中运行的所有进程,可以使用-e选项。另外,-o选项可以指定显示结果的格式,比如如下命令:

ps -e -o pid,ppid,user,start_time,command

分别显示pid,父进程的pid,运行进程的用户名,进程开始运行的时间和运行进程的命令。

 

创建进程的两种方式:

1、使用system

system是标准C库(Standard C library)中的一个函数。它可以像在终端中执行一条命令那样执行一个已经存在的可执行程序。它的去点是效率不高,而且比较危险。实际上,system函数创建了一个子进程来运行Bourne Shell,并用这个Shell来执行命令。比如,下面的程序和你在终端中执行"ls -l /"是一样的:

#include <stdlib.h>

int main(void)
{
    int return_value;
    return_value = system("ls -l /");
    return return_value;
}

2、使用fork和exec

与第一种方式相比,这种方式更复杂,但是提供了更大的弹性,更好的速度和安全性。首先介绍fork函数。

在一个进程中调用fork函数会复制该进程,即产生一个子进程,父进程和子进程都从调用fork函数后独立运行。他们的不同之处是,父进程保持原来的pid,而子进程将获得一个新的pid。调用fork函数的返回值是pid_t类型的,在父进程中,fork返回子进程号,而在子进程中,fork函数返回0.所以,可以通过返回值来判断程序是运行在父进程中还是子进程中。

exec是一个函数族,它用另一个程序代替现在正在运行的进程。根据这个名字的不同,这个函数族中的函数有一些区别:

1)、函数名中含有p的,在当前目录下寻找程序;不含p的,需要给出程序的绝对路径。

2)、函数名中含有v的,接收一个以NULL结尾的指针数组作为参数;

3)、函数名中含有e的,接收一个额外的参数——以NULL结尾的指向char string的一个数组,该参数作为环境变量。

由于exec函数族用新的程序代替当前运行的进程,因此,除非该函数调用出错,否则该函数是不会返回的。使用exec函数传递参数时,和main函数使用的参数是一样的,即argv[0]表示的是程序的名称,在使用exec函数的时候要注意。

下面使用fork和exec来完成上面使用system函数完成的相同功能。不同的是,system使用Shell来执行程序,而这里我们是直接使用的ls命令。

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

int spawn (char* program, char** arg_list)
{
    pid_t child_pid;

    child_pid = fork ();
    if (child_pid != 0)
        return child_pid;
    else
    {
        execvp (program, arg_list);
        fprintf (stderr, “an error occurred in execvp\n”);
        abort ();
    }
}

int main ()
{
    char* arg_list[] = {
    “ls”,
    “-l”,
    “/,
    NULL
    };

    spawn (“ls”, arg_list);
    printf (“done with main program\n”);
    return 0;
}

阅读(1948) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~