linux c 进程编程,linux c/c++ 编程之-----进程操作
進程
系統調用 getpid 可以得到進程的 ID,而 getppid 可以得到父進程(創建調用該函數進程的進程)的 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 ;
進程的創建
#include ;
pid_t fork();
當一個進程調用了 fork 以后,系統會創建一個子進程.這個子進程和父進程不同的地方只有他的進程 ID 和父進程 ID,其他的都是一樣.就象符進程克隆(clone)自己一樣.
當然創建兩個一模一樣的進程是沒有意義的.為了區分父進程和子進程,我們必須跟蹤 fork 的返回值. 當 fork 掉用失敗的時候(內存不足或者是用戶的最大進程數已到)fork 返回-1,否則 fork 的返回值有重要的作用.對于父進程 fork 返回子進程的 ID,而對于 fork 子進程返回 0.我們就是根據這個返回值來區分父子進程的. 父進程為什么要創建子進程呢?前面我們已經說過了 Linux 是一個多用戶操作系統,在同一時間會有許多的用戶在爭奪系統的資源.有時進程為了早一點完成任務就創建子進程來爭奪資源. 一旦子進程被創建,父子進程一起從fork 處繼續執行,相互競爭系統的資源.有時候我們希望子進程繼續執行,而父進程阻塞直到子進程完成任務.這個時候我們可以調用 wait 或者 waitpid 系統調用.
#include ;
#include ;
pid_t wait(int *stat_loc);
pid_t waitpid(pid_t pid,int *stat_loc,int options);
wait 系統調用會使父進程阻塞直到一個子進程結束或者是父進程接受到了一個信號.如果沒有父進程沒有子進程或者他的子進程已經結束了 wait 回立即返回.成功時(因一個子進程結束)wait 將返回子進程的 ID,否則返回-1,
父進程創建子進程后,子進程一般要執行不同的程序.為了調用系統程序,我們可以使用系統調用 exec 族調用.exec 族調用有著 5 個函數.
#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 族調用可以執行給定程序
如果在 Linux 下編寫一個"常駐內存"的程序卻是很容易的.我們只要幾行代碼就可以做到.
實際上由于 Linux 是多任務操作系統,我們就是不編寫代碼也可以把一個程序放到后臺去執行的.
我們只要在命令后面加上&符號 SHELL 就會把我們的程序放到后臺去運行的.
后臺進程的創建思想: 首先父進程創建一個子進程.然后子進程殺死父進程?信號處理所有的工作由子進程來處理.
1、調用fork函數,創建一個子進程。
2、先讓父進程自然結束。
3、在子進程中調用setpgrp(),把子進程的進程組ID設為子進程的進程ID。
4、在子進程中調用setsid(),創建一個新的Session(會話),這樣子進程就與當前的控制終端脫離,也接受不到當前終端的(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設置為該進程的進程ID。
setpgrp();
cout << "----------in child process. setpgrp()----------" << endl;
print();
cout << "--------------------------------------" << endl;
//創建一個新的Session,斷開與控制終端的關聯。也就是說Ctrl+c的觸發的SIGINT信號,該進程接收不到。
setsid();
//后臺的內容 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; }
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的linux c 进程编程,linux c/c++ 编程之-----进程操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux move权限,Red Hat
- 下一篇: linux 其他常用命令