第八章 进程控制 wait函数

wait(等待子进程中断或结束)

表头文件
     #include<sys/types.h>
     #include<sys/wait.h>
定义函数 pid_t wait (int * status);
函数说明:
    wait()会暂时停止目前进程的执行,直到有信号来到或子进程结束。
    如果在调用 wait()时子进程已经结束,则 wait()会立即返回子进程结束状态值。
    子进程的结束状态值会由参数 status 返回,而子进程的进程识别码也会一起返回。
   如果不在意结束状态值,则参数 status 可以设成 NULL。
     子进程的结束状态值请参考 waitpid( )     
如果执行成功则返回子进程识别码(PID) ,如果有错误发生则返回返回值-1。失败原因存于 errno 中。
pid_t  pid1;  int status=0;     
i=wait(&status);
i返回的是子进程的识别码;PID
status中存的是子进程的结束状态;可用WEXITSTATUS(status)得到子进程的exit(3)的状态,那么就是3;

 #include "apue.h"
 #include <sys/wait.h>

 void pr_exit(int status)
 {
   if(WIFEXITED(status))
   {
     printf("normal termination,exit status = %d\n",WEXITSTATUS(status));
   }
   else if(WIFSIGNALED(status))
   {
     printf("abnormal termination,signal number = %d%s\n",
         WTERMSIG(status),
 #ifdef WCOREDUMP
         WCOREDUMP(status)? "(core file generated)":"");
 #else
         "");
 #endif
   }

   else if(WIFSTOPPED(status))
   {
     printf("child stopped,signal number =%d\n",WSTOPSIG(status));
   }
 }


 int main(void)
 {
   pid_t pid;
   int status;

   if((pid=fork())<0)
   {
     err_sys("fork error");
   }
   else if(pid==0)
   {
     //child
     exit(7);
   }

   if(wait(&status)!=pid)
   {
     err_sys("wait error");
   }


  pr_exit(status);

  if((pid=fork())<0)
  {
    err_sys("fork error");
  }
  else if(pid==0)
  {
    abort();//generates SIGABRT
  }

  if(wait(&status)!=pid)
  {
    err_sys("wait error");
  }
  pr_exit(status);

  if((pid=fork())<0)
  {
    err_sys("fork error");
  }
  else if(pid==0)
  {
    //child
    status/=0;//generates SIGFPE
  }

  if(wait(&status)!=pid)
  {
    err_sys("wait error");
  }

  pr_exit(status);

  exit(0);

}

jiang@AY140524110335068908Z:~/new_apue$ ./a.out
normal termination,exit status = 7
abnormal termination,signal number = 6
abnormal termination,signal number = 8
jiang@AY140524110335068908Z:~/new_apue$
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CreateProcess函数可以用来创建一个新的进程。以下是使用CreateProcess函数的步骤: 1. 包含Windows.h头文件。 2. 定义一个PROCESS_INFORMATION结构体和一个STARTUPINFO结构体。 PROCESS_INFORMATION结构体用来存储新进程的信息,如进程句柄和进程ID。 STARTUPINFO结构体用来指定新进程的属性,如窗口大小和标准输入输出的句柄。 3. 调用CreateProcess函数。 CreateProcess函数的第一个参数是应用程序的路径,第二个参数是命令行参数,第三个参数是安全属性,第四个参数是线程安全属性,第五个参数是指定是否创建一个新的控制台窗口,第六个参数是指定创建新进程的标志,第七个参数是指定环境变量,第八个参数是指定当前目录,第九个参数是STARTUPINFO结构体,第十个参数是PROCESS_INFORMATION结构体。 4. 关闭句柄。 关闭新进程的句柄和主线程的句柄。 以下是一个简单的使用CreateProcess函数的例子: ```c++ #include <Windows.h> #include <iostream> using namespace std; int main() { STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); // Start the child process. if (!CreateProcess(NULL, // No module name (use command line) (LPSTR)"notepad.exe", // Command line NULL, // Process handle not inheritable NULL, // Thread handle not inheritable FALSE, // Set handle inheritance to FALSE 0, // No creation flags NULL, // Use parent's environment block NULL, // Use parent's starting directory &si, // Pointer to STARTUPINFO structure &pi) // Pointer to PROCESS_INFORMATION structure ) { cout << "CreateProcess failed" << endl; return 1; } // Wait until child process exits. WaitForSingleObject(pi.hProcess, INFINITE); // Close process and thread handles. CloseHandle(pi.hProcess); CloseHandle(pi.hThread); return 0; } ``` 这个例子会启动一个记事本程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值