1. 程式人生 > >Linux生成子程序函式fork()

Linux生成子程序函式fork()

一片非常詳細的文章:http://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/fork/create.html

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

void parentProcess(int n) {
  for (int i = 0; i < n; ++i) {
    printf("Parent: %d\n", i);
    sleep(1);  // 睡眠一秒防止執行過快
} } void childProcess(int n) { for (int i = 0; i < n; ++i) { printf("Child: %d\n", i); sleep(1); } } int main() { pid_t pid; pid = fork(); if (pid == 0) { childProcess(10); } else { parentProcess(10); } return 0; }

補充說明:如果父程序先建立了一些檔案,然後在fork出一些子程序,那麼子程序會和父程序共享核心的資源。舉例說明:

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <sys/stat.h>

#define MAXN_BUFFER_SIZE 20

int main() {
  int fd = open("./text.txt", O_CREAT | O_RDWR)
; if (fd < 0) { perror("open() error\n"); exit(EXIT_FAILURE); } pid_t cpid = fork(); if (cpid == 0) { // 子程序 const char* msg = "child process\n"; if (write(fd, msg, strlen(msg)) < 0) { perror("child write() error\n"); } } else { // 父程序 const char* msg = "parent process\n"; if (write(fd, msg, strlen(msg)) < 0) { perror("parent write() error\n"); } wait(NULL); // 等待子程序結束 exit(EXIT_SUCCESS); } }

此時,檔案的內容是:

parent process
child process

可以看出,子程序複製了父程序的fd,而且對應了相同的核心資源。但是複製的時候,有很多是不能複製的,具體參照fork函式的man手冊。