威尼斯wns.9778官网活动_vnsc威尼斯城官网

热门关键词: 威尼斯wns.9778官网活动,vnsc威尼斯城官网
当前位置:威尼斯wns.9778官网活动 > 计算机教程 > Linux 编程之进程fork()详解及实例

Linux 编程之进程fork()详解及实例

文章作者:计算机教程 上传时间:2019-05-11

查看当前系统进程的状态 ps auxf 

  pipe(file_descriptors);

    按时间片轮转  
    先来先服务 
    短时间优先 
    按优先级别   

  /*打印出信号量的值*/

    子进程从fork()后开始运行, 它得到的fork返回值为0 
    父进程得到的返回值为子进程的进程号 
    返回值为-1时, 创建失败

 在新的namespace启动子进程,namespace描述了进程的文件hierarchy

来看一个程序:

}

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

int main(void) 
{ 
  pid_t pid ;  
  //printf("hello world n"); 

  //从fork开始就已经产生子进程 
  pid = fork();  //就已经产生新的4G空间,复制空间 
  //创建出来的子进程是父进程的一个副本,除了进程号,父进程号和子进程号不同 
  //printf("hello kittyn"); 
  if(pid == 0)   
  { 
    //子进程运行区 

    printf("child curpid:%d parentpid:%d n" , getpid() , getppid()); 
    return 0 ;  
  } 

  //父进程运行区 
  printf("parent curpid:%d parentpid:%d n" , getpid() , getppid()); 

  return 0 ;  
} 

wait系统调用包括:

   进程,  运行中的程序   

Linux的进程间通信(IPC,InterProcess Communication)通信方法有管道、消息队列、共享内存、信号量、套接口等。

在开始之前,我们先来了解一些基本的概念:

  }

  1. 进程的状态:       

        就绪   ->>   运行  ->> 等待 
        运行 ->> 就绪 //时间片完了 
        等待 ->> 就绪 //等待的条件完成了   

  printf("semaphore id=%d"n", id);

您可能感兴趣的文章:

CLONE_FS

  1. 程序, 没有在运行的可执行文件  

  if (semop(id, &lock_it, 1) ==  - 1)

Linux fork()详解:

CLONE_VM

D    Uninterruptible sleep (usually IO) 
R    Running or runnable (on run queue) 
S    Interruptible sleep (waiting for an event to complete) 
T    Stopped, either by a job control signal or because it is being traced. 
W    paging (not valid since the 2.6.xx kernel) 
X    dead (should never be seen) 
Z    Defunct ("zombie") process, terminated but not reaped by its parent. 
<    high-priority (not nice to other users) 
N    low-priority (nice to other users) 
L    has pages locked into memory (for real-time and custom IO) 
s    is a session leader 
l    is multi-threaded (using CLONE_THREAD, like NPTL pthreads do) 
    is in the foreground process group   

套接字通信并不为Linux所专有,在所有提供了TCP/IP协议栈的操作系统中几乎都提供了socket,而所有这样操作系统,对套接字的编程方法几

  1. 父进程/子进程 , 让一个程序运行起来的进程就叫父进程, 被调用的进程叫子进程   

  2. getpid //获取当前进程的进程号 
       getppid //获取当前进程的父进程号   

  3. fork //创建一个子进程,创建出来的子进程是父进程的一个副本, 除了进程号,父进程号不同。  

CLONE_THREAD

  1. 进程调度的方法:  

享),父进程随即就感觉到了,这就是clone的特点。

status: 

方式定义,参数filedis返回两个文件描述符filedes[0]为读而打开,filedes[1]为写而打开,filedes[1]的输出是filedes[0]的输入;

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

  {

    printf("Error in fork"n");

};

}

}

    }

系统调用exit的功能是终止本进程,其函数原型为:

1.Linux进程

在Linux中可使用exec函数族,包含多个函数(execl、execlp、execle、execv、execve和execvp),被用于启动一个指定路径和文件名的进程。

  char buf[BUFFER_LEN];

      /* 子进程执行此命令*/

    printf("in the spawning (parent) process..."n");

  }

clone

   return 0;

   clone(do_something, child_stack, CLONE_VM|CLONE_FILES, NULL);

void _exit(int status);

    if (fork() == 0)

      returned_count, buf);

  options.val = 1; /*设置变量值*/

      perror(command);

wait的作用为发出调用的进程只要有子进程,就睡眠到它们中的一个终止为止;waitpid等待由参数pid指定的子进程退出。

{

  lock_it.sem_flg = IPC_NOWAIT; /*操作方式*/

    /*执行父进程*/

此函数返回创建进程的PID,函数中的flags标志用于设置创建子进程时的相关选项,具体含义如下表:

  id = semget(unique_key, 1, IPC_CREAT | IPC_EXCL | 0666);

      printf("This is child process"n");

  if (in_file == NULL)

  {

  int i;

      printf("This is child process"n");

 含义

void main()

后清除信号量:

  i = semctl(id, 0, GETVAL, 0);

  int count = 1;

    else

 

       Linux进程在内存中包含三部分数据:代码段、堆栈段和数据段。代码段存放了程序的代码。代码段可以为机器中运行同一程序的数个

 

fork函数可以创建一个子进程而当前进程不死,如果我们在fork的子进程中调用exec函数族就可以实现既让父进程的代码执行又启动一个新的

}

下面是一个使用信号量的例子,该程序创建一个特定的IPC结构的关键字和一个信号量,建立此信号量的索引,修改索引指向的信号量的值,最

  out_file = fopen("pipeexample", "w");

mkfifo是一个函数,mknod是一个系统调用,即我们可以在shell下输出上述命令。

  int i;

    printf("Error in fdopen."n");

{

  }

};

{

The variable is now 42

  }

乎是完全一样的。

程序的输出结果告诉我们,子进程将文件关闭并将变量修改(调用clone时用到的CLONE_VM、CLONE_FILES标志将使得变量和文件描述符表被共

      exit(errorno);

fork在英文中是“分叉”的意思,这个名字取得很形象。一个进程在运行中,如果使用了fork,就产生了另一个进程,于是进程就“分叉”了

   sleep(1);   /* 延时以便子进程完成关闭文件操作、修改变量 */

 

void main()

}

      printf("This is parent process"n");

    printf("Error opening pipe.");

    command[strlen(command) - 1] = 0;

 

际地址。此后,进程可以对此地址进行读写操作访问共享内存。

This is child process

  else

标志

本章讲述了Linux进程的概念,并以多个实例讲解了进程控制及进程间通信方法,理解这一章的内容可以说是理解Linux这个操作系统的关键。

  {

  int id;

  /*清除信号量*/

威尼斯wns.9778官网活动, 

   printf("We could read from the file"n");

 子进程与父进程运行于相同的内存空间

这个函数基本上实现了一个shell的功能,它读取用户输入的进程名和参数,并启动对应的进程。

 {

  }

 

下面我们来以一个进程从创建到消亡的过程讲解Linux进程状态转换的“生死因果”。

 

    for (i = 1; i < 10000; i )

    printf("%d bytes of data received from spawned process: %s"n",

char command[MAX_CMD_LEN];

    }

};

    exit(1);

wait可获得此值。

 父进程被挂起,直至子进程释放虚拟内存资源

sleep

  int i;

    /* 从终端读取要执行的命令*/

This is parent process

    exit(1);

Linux下的C编程实战(三)

  int returned_count;

  sprintf(buf, "this is test data for the named pipe example"n");

上述程序中,无名管道以

      execlp(command, command);

  while (1)

}

 

  {

      wait(&rtn);

    }

    printf("received from pipe: %s"n", buf);

void *shmat(int shmid, void *addr, int flag); /* 将共享内存连接到自身地址空间中*/

  struct sembuf lock_it;

(4)内核调度该进程进入内核状态,再由内核状态返回用户状态执行。该进程在用户状态运行一定时间后,又会被调度程序所调度而进入内核状态,由此转入就绪态。有时进程在用户状态运行时,也会因为需要内核服务,使用系统调用而进入内核状态,服务完毕,会由内核状态转回用户状态。要注意的是,进程在从内核状态向用户状态返回时可能被抢占,这是由于有优先级更高的进程急需使用CPU,不能等到下一次调度时机,从而造成抢占;

2.进程控制

  while ((count = fread(buf, 1, BUFFER_LEN, in_file)) > 0)

 子进程与父进程共享相同的文件描述符(file descriptor)表

  printf("value of semaphore at index 0 is %d"n", i);

 创建的子进程的父进程是调用者的父进程,新进程与创建它的进程成了“兄弟”而不是“父子”

  }

}

wait

CLONE_PTRACE

此时此刻,我们还没有完全理解fork()函数,再来看下面的一段程序,看看究竟会产生多少个进程,程序的输出是什么?

#include <stdio.h>

且要使用此函数必须在编译内核时设置clone_actually_works_ok选项。

 

该函数使得系统分配size大小的内存用作共享内存;

  int file_descriptors[2];

   char tempch;

  char buf[BUFFER_LEN];

This is parent process

{

  }

  else

  if (out_file == NULL)

/* 进程二:写有名管道*/

    close(file_descriptors[INPUT]);

    }

 

CLONE_VFORK

对于没有接触过Unix/Linux操作系统的人来说,fork是最难理解的概念之一,它执行一次却返回两个值,完全“不可思议”。先看下面的程序

 

  if (pid == 0)

    write(file_descriptors[OUTPUT], "test data", strlen("test data"));

 

    for (i = 1; i < 3; i )

CLONE_PID

int main(int argc, char *argv[]) {

  }

      /* 父进程,等待子进程结束,并打印子进程的返回值*/

      perror("File Read Error");

消息队列用于运行于同一台机器上的进程间通信,与管道相似;

本文由威尼斯wns.9778官网活动发布于计算机教程,转载请注明出处:Linux 编程之进程fork()详解及实例

关键词: