进程控制常用的一些操作
生活随笔
收集整理的這篇文章主要介紹了
进程控制常用的一些操作
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、獲取進程的id
int main0() {printf ("當前進程 ID %d\n", getpid());printf ("當前父進程:%d\n", getppid());printf ("當前用戶: %d\n", getuid());while (1);return 0; }2、fork 和 vfork之前的博客里有,這里就不啰嗦了
// fork int main1() {// fork : 創建一個子進程// 如果創建失敗,返回-1// 成功返回兩個值,如果是在父進程,返回子進程的ID// 如果是在子進程,返回值是0pid_t pid = fork();if (-1 == pid){perror ("fork");return -1;}if (pid > 0) // 父進程{printf ("我是父進程,pid = %d\n", getpid());}else // 子進程{printf ("我是子進程,pid = %d\n", getpid());}while (1);return 0;}// fork1 父進程和子進程是異步的,輸出都是1 int main2() {int count = 0;pid_t pid = fork();count++;printf ("count = %d\n", count);return 0; }// fork2 會產生8個進程 int main3() {fork();fork();fork();printf ("a\n");while (1);return 0; }// fork3 產生20個進程 int main4() {fork(); // 產生2個進程fork() && fork() || fork(); // 之前的每個進程都會產生5個進程fork(); // 翻倍printf ("a\n");while (1);return 0;}// 1、vfork 的子進程必須要顯示調用 exit(); // 2、vfork 子進程和父進程共享數據段 // 3、vfork 的子進程先于父進程執行,子進程執行完,CPU才能調度到父進程 int main5() {int count = 0;pid_t pid = vfork();if (pid < 0){perror ("vfork");return -1;}count++;if (pid > 0) // 父進程{printf ("我是父進程,pid = %d count = %d\n", getpid(), count);}else // 子進程{printf ("我是子進程:pid = %d count = %d\n", getpid(), count);while (1);exit (0);}return 0; }3、exec函數族
// execl 格式:int execl(const char * path, const char* arg1,...) int main6() {// 第一個參數需要一個路徑,能夠找到需要執行的文件// 后面的參數表明執行的方式,和在終端方式類似,如果程序執行需要// 其他的參數 ls -l,參數要作為函數的實參傳過去// 最后需要補一個 NULLint ret = execl ("/bin/ls", "ls", NULL);if (-1 == ret){perror ("exexl");return -1;} return 0; }int main7() {// 產生一個新的程序,替換了原有的程序,原有的進程 id 是不變的// int ret = execl ("bin/ls", "ls", "-l", NULL);int ret = execl ("/bin/ps", "ps", "-ef", NULL);if (-1 == ret){perror ("execl");return -1;}printf ("aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n");return 0; }// execv 格式:int execv(const char * path, const char *argv[]) int main8() {char* a[] = {"file.c", NULL};int ret = execv("file", a);if (-1 == ret){perror ("execl");return -1;}return 0; }// execlp 格式:int execlp(const char * path, const char* arg1,...) int main9() {int ret = execlp ("./file", "file", NULL);if (-1 == ret){perror ("execl");return -1;}return 0; }int main10() {int ret = execlp ("ls", "ls", "-l", NULL);if (-1 == ret){perror ("execl");return -1;}printf ("aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n");return 0; }// system int main11() {printf ("請選擇文件:\n");system ("ls /home");char str[100];while (1){fgets (str, 100, stdin);printf ("[root@promote 15]# ");system (str);}return 0; }int main12() {printf ("hello world\n");sleep (1);// 在內部fork()一個子進程,調用 /bin/sh -c string來執行system ("ps -ef | grep a.out");printf ("aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n");return 0; }4、進程的終止
// 進程退出 void func() {printf ("33333333333333333333333\n");exit (0); // 進程終止 }int main13() {printf ("hello\n");printf ("1111111111111111");// 在停止進程前,要檢查文件的打開情況,并把文件緩沖區中// 的內容寫回文件才停止進程exit (0);return 0; }int main14() {printf ("hello\n");printf ("11111111111111111");// _exit:直接使進程停止,清除其使用的內存,并清除緩沖區中內容_exit (0);return 0; }總結
以上是生活随笔為你收集整理的进程控制常用的一些操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 多态_Java 多态
- 下一篇: hook什么意思_这是什么骚代码!