Linux生成子程序函式fork()
阿新 • • 發佈:2019-01-13
一片非常詳細的文章: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手冊。