(1)fork()创建子进程
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/wait.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <errno.h>
- #include <math.h>
- /* 进程创建 */
- void main(void)
- {
- pid_t child;
- int status;
- printf("This will demostrate how to get child status\n");
- /* 创建子进程 */
- if((child=fork())==-1)
- {
- printf("Fork Error : %s\n", strerror(errno));
- exit(1);
- }
- else if(child==0) // 子进程
- {
- int i;
- printf("I am the child: %s\n", getpid());
- for(i=0;i<1000000;i++) sin(i);
- i=5;
- printf("I exit with %d\n", i);
- exit(i);
- }
- while(((child=wait(&status))==-1)&(errno==EINTR)); //子进程未结束
- if(child==-1)
- printf("Wait Error: %s\n", strerror(errno));
- else if(!status) // 子进程退出值为0
- printf("Child %ld terminated normally return status is zero\n", child);
- else if(WIFEXITED(status)) // 子进程退出值0
- printf("Child %ld terminated normally return status is %d\n", child, WEXITSTATUS(status));
- else if(WIFSIGNALED(status)) // 子进程未获信号而退出
- printf("Chlid %ld terminated due to signal %d not caught\n", child, WTERMSIG(status));
- }
(2)进程等待waitpid()
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/types.h>
- #include <unistd.h>
- #include <sys/wait.h>
- void die(const char *msg)
- {
- perror(msg);
- exit(1);
- }
- void child2_do()
- {
- printf("In child2: execute 'date'\n");
- sleep(5);
- if (execlp("date", "date", NULL) < 0) {
- perror("child2 execlp");
- }
- }
- void child1_do(pid_t child2, char *argv)
- {
- pid_t pw;
- do {
- if (*argv == '1') {
- pw = waitpid(child2, NULL, 0);
- }
- else {
- pw = waitpid(child2, NULL, WNOHANG);
- }
- if (pw == 0) {
- printf("In child1 process:\nThe child2 process has not exited!\n");
- sleep(1);
- }
- }while (pw == 0);
- if (pw == child2) {
- printf("Get child2 %d.\n", pw);
- sleep(5);
- if (execlp("pwd", "pwd", NULL) < 0) {
- perror("child1 execlp");
- }
- }
- else {
- printf("error occured!\n");
- }
- }
- void father_do(pid_t child1, char *argv)
- {
- pid_t pw;
- do {
- if (*argv == '1') {
- pw = waitpid(child1, NULL, 0);
- }
- else {
- pw = waitpid(child1, NULL, WNOHANG);
- }
- if (pw == 0) {
- printf("In father process:\nThe child1 process has not exited.\n");
- sleep(1);
- }
- }while (pw == 0);
- if (pw == child1) {
- printf("Get child1 %d.\n", pw);
- if (execlp("ls", "ls", "-l", NULL) < 0) {
- perror("father execlp");
- }
- }
- else {
- printf("error occured!\n");
- }
- }
- int main(int argc, char *argv[])
- {
- pid_t child1, child2;
- if (argc < 3) {
- printf("Usage: waitpid [0 1] [0 1]\n");
- exit(1);
- }
- child1 = fork();
- if (child1 < 0) {
- die("child1 fork");
- }
- else if (child1 == 0) {
- child2 = fork();
- if (child2 < 0) {
- die("child2 fork");
- }
- else if (child2 == 0) {
- child2_do();
- }
- else {
- child1_do(child2, argv[1]);
- }
- }
- else {
- father_do(child1, argv[2]);
- }
- return 0;
- }
(3)结束进程函数 kill()
- #include <sys/wait.h>
- #include <sys/types.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <signal.h>
- int main( void )
- {
- pid_t childpid;
- int status;
- int retval;
- childpid = fork();
- if ( -1 == childpid )
- {
- perror( "fork()" );
- exit( EXIT_FAILURE );
- }
- else if ( 0 == childpid )
- {
- puts( "In child process" );
- sleep( 100 );//让子进程睡眠,看看父进程的行为
- exit(EXIT_SUCCESS);
- }
- else
- {
- if ( 0 == (waitpid( childpid, &status, WNOHANG )))
- {
- retval = kill( childpid,SIGKILL );
- if ( retval )
- {
- puts( "kill failed." );
- perror( "kill" );
- waitpid( childpid, &status, 0 );
- }
- else
- {
- printf( "%d killed\n", childpid );
- }
- }
- }
- exit(EXIT_SUCCESS);
- }