linux c 进程编程,linux c/c++ 编程之-----进程操作
進程
系統(tǒng)調(diào)用 getpid 可以得到進程的 ID,而 getppid 可以得到父進程(創(chuàng)建調(diào)用該函數(shù)進程的進程)的 ID.
#include ;
pid_t getpid(void);
pid_t getppid(void);
struct passwd {
char *pw_name; /* 登錄名稱 */
char *pw_passwd; /* 登錄口令 */
uid_t pw_uid; /* 用戶 ID */
gid_t pw_gid; /* 用戶組 ID */
char *pw_gecos; /* 用戶的真名 */
char *pw_dir; /* 用戶的目錄 */
char *pw_shell; /* 用戶的 SHELL */
};
#include ;
#include ;
進程的創(chuàng)建
#include ;
pid_t fork();
當(dāng)一個進程調(diào)用了 fork 以后,系統(tǒng)會創(chuàng)建一個子進程.這個子進程和父進程不同的地方只有他的進程 ID 和父進程 ID,其他的都是一樣.就象符進程克隆(clone)自己一樣.
當(dāng)然創(chuàng)建兩個一模一樣的進程是沒有意義的.為了區(qū)分父進程和子進程,我們必須跟蹤 fork 的返回值. 當(dāng) fork 掉用失敗的時候(內(nèi)存不足或者是用戶的最大進程數(shù)已到)fork 返回-1,否則 fork 的返回值有重要的作用.對于父進程 fork 返回子進程的 ID,而對于 fork 子進程返回 0.我們就是根據(jù)這個返回值來區(qū)分父子進程的. 父進程為什么要創(chuàng)建子進程呢?前面我們已經(jīng)說過了 Linux 是一個多用戶操作系統(tǒng),在同一時間會有許多的用戶在爭奪系統(tǒng)的資源.有時進程為了早一點完成任務(wù)就創(chuàng)建子進程來爭奪資源. 一旦子進程被創(chuàng)建,父子進程一起從fork 處繼續(xù)執(zhí)行,相互競爭系統(tǒng)的資源.有時候我們希望子進程繼續(xù)執(zhí)行,而父進程阻塞直到子進程完成任務(wù).這個時候我們可以調(diào)用 wait 或者 waitpid 系統(tǒng)調(diào)用.
#include ;
#include ;
pid_t wait(int *stat_loc);
pid_t waitpid(pid_t pid,int *stat_loc,int options);
wait 系統(tǒng)調(diào)用會使父進程阻塞直到一個子進程結(jié)束或者是父進程接受到了一個信號.如果沒有父進程沒有子進程或者他的子進程已經(jīng)結(jié)束了 wait 回立即返回.成功時(因一個子進程結(jié)束)wait 將返回子進程的 ID,否則返回-1,
父進程創(chuàng)建子進程后,子進程一般要執(zhí)行不同的程序.為了調(diào)用系統(tǒng)程序,我們可以使用系統(tǒng)調(diào)用 exec 族調(diào)用.exec 族調(diào)用有著 5 個函數(shù).
#include ;
int execl(const char *path,const char *arg,...);
int execlp(const char *file,const char *arg,...);
int execle(const char *path,const char *arg,...);
int execv(const char *path,char *const argv[]);
int execvp(const char *file,char *const argv[]):
exec 族調(diào)用可以執(zhí)行給定程序
如果在 Linux 下編寫一個"常駐內(nèi)存"的程序卻是很容易的.我們只要幾行代碼就可以做到.
實際上由于 Linux 是多任務(wù)操作系統(tǒng),我們就是不編寫代碼也可以把一個程序放到后臺去執(zhí)行的.
我們只要在命令后面加上&符號 SHELL 就會把我們的程序放到后臺去運行的.
后臺進程的創(chuàng)建思想: 首先父進程創(chuàng)建一個子進程.然后子進程殺死父進程?信號處理所有的工作由子進程來處理.
1、調(diào)用fork函數(shù),創(chuàng)建一個子進程。
2、先讓父進程自然結(jié)束。
3、在子進程中調(diào)用setpgrp(),把子進程的進程組ID設(shè)為子進程的進程ID。
4、在子進程中調(diào)用setsid(),創(chuàng)建一個新的Session(會話),這樣子進程就與當(dāng)前的控制終端脫離,也接受不到當(dāng)前終端的(ctrl + c)消息。
/*
* Author: ACb0y
* FileName: main.cpp
* Create Time: 2011-07-24
* Version: V1.0
*/
#include
#include
using namespace std;
void print()
{
int pid = getpid();
int gid = getpgid(0);
cout << "process group id = " << gid << endl;
cout << "process id = " << pid << endl;
}
int main()
{
//create a child process.
int pid = fork();
if (-1 == pid)
{
cout << "call function fork() error!" << endl;
}
else if (0 == pid) //return from child process.
{
cout << "----------in child process.----------" << endl;
print();
cout << "--------------------------------------" << endl;
//將該進程的進程組ID設(shè)置為該進程的進程ID。
setpgrp();
cout << "----------in child process. setpgrp()----------" << endl;
print();
cout << "--------------------------------------" << endl;
//創(chuàng)建一個新的Session,斷開與控制終端的關(guān)聯(lián)。也就是說Ctrl+c的觸發(fā)的SIGINT信號,該進程接收不到。
setsid();
//后臺的內(nèi)容 for (int i = 0; i < 5; ++i)? { sleep(20); cout << "----------in child process.----------" << endl; print(); cout << "--------------------------------------" << endl; } } else //return from parent process. { cout << "----------in parent process.----------" << endl; print(); cout << "--------------------------------------" << endl; } return 0; }
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的linux c 进程编程,linux c/c++ 编程之-----进程操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux move权限,Red Hat
- 下一篇: linux监控哪些目录,linux管理文