初學linux的fork筆記

gcrisis發表於2018-11-09

fork函式用來建立linux程式,使用前需要標頭檔案 #include <unistd.h>,函式原型如下:

         pid_t fork(void);

執行命令後會建立一個與呼叫程式相同的程式,呼叫程式稱為父程式,新建的程式稱為子程式。兩個程式有如下一些特點:

1、在父程式中該函式返回子程式的ID號,在子程式中函式返回0;

2、子程式與父程式的全域性變數名稱和地址相同,但是實際對應的實體地址是不同的;

3、子程式是父程式的拷貝,雖然不是完全繼承父程式的狀態,但是隻要是能夠繼承的在fork之前執行過的程式碼也相當於子程式執行了一次,舉例如下:

在下面的程式碼中,在判斷pid之前建立了共享記憶體空間,所以在fork之後子程式可以直接使用buffer訪問共享空間。如果是在if判斷pid之後的程式裡建立,則需要在另一個程式程式碼中加入獲取共享記憶體地址的程式碼進行對映。

uint8_t* buffer
int main()
{
        pid_t pid;
        shmid = shmget(0x2234,sizeof(uint8_t)*TX_BUFFER_SIZE,IPC_CREAT|0666);
	printf("shmid = %d\n",shmid);
	buffer=shmat(shmid,NULL,0);
	pid = fork();
	printf("pid is %d\n",pid);
	if(pid == 0)
	{
		child_pro();
	}
	else
	{
		father_pro();
	}
	return 0;
}

共享記憶體涉及的標頭檔案有#include <sys/ipc.h>、#include <sys/shm.h>、#include <sys/types.h>

多核系統中,程式預設在多個核心執行,根據需求可以指定程式在特定的核心上執行。使用前需要標頭檔案#include <sched.h>和巨集定義 #define _GNU_SOURCE。

    cpu_set_t mask;
	CPU_ZERO(&mask);
	CPU_SET(1,&mask);
	sched_setaffinity(0,sizeof(cpu_set_t),&mask);

函式原型如下:

     int sched_setaffinity(pid_t pid, size_t cpusetsize,cpu_set_t *mask);

pid:程式pid,如果是0表示本程式;

cpusetsize:通常為sizeof(cpu_set_t);

mask:

使用taskset -p <PID>可以檢視PID程式的affinity mask,數字的二進位制中1的位就表示該程式跑的核心。

taskset -pc <core> <PID> 指定PID在core上執行。

標頭檔案說明:

#define _GNU_SOURCE
#include<stdio.h>        //標準輸入輸出
#include<unistd.h>        //posix標準api
#include<sys/types.h>      //_LP64 和 _ILP32 的定義
#include<sched.h>
#include<string.h>
#include<pthread.h>
#include<stdlib.h>
#include<sys/shm.h>
#include<sys/ipc.h>

 

 

相關文章