Linux下C语言开发-多进程开发

文章目录

大家都知道,为了提高程序运行效率,充分利用计算机资源,一般会选用多进程或者多线程的方式进行程序开发。今天本文来介绍下如何进行基于多进程开发。

进程的创建

进程的创建十分简单,仅需要fork()函数即可。但是需要注意的是,子进程与父进程之间除了代码是共享的之外,堆栈数据和全局数据均是独立的。

参考示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <unistd.h>  
#include <stdio.h>  
#include <stdlib.h>  
#include <math.h>  
#include <errno.h>  
#include <sys/types.h>  
#include <sys/wait.h>  
 
int main()  
{  
    pid_t pid;  
 
    if(-1 == (pid = fork()))  
    {  
        printf("Error happened in fork function!\n");  
        return 0;  
    }  
 
    if(0 == pid)  
    {  
        printf("This is child process: %d\n", getpid());  
    }  
    else  
    {  
        printf("This is parent process: %d\n", getpid());  
    }  
 
    return 0;  
}

进程的等待

所谓进程等待,其实很简单。前面我们说过可以用fork创建子进程,那么这里我们就可以使用wait函数让父进程等待子进程运行结束后才开始运行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 
int main(int argc, char* argv[])
{
    pid_t pid;
 
    pid = fork();
    if(0 == pid)
    {
        printf("This is child process, %d\n", getpid());
        sleep(5);
    }
    else
    {
        wait(NULL);
        printf("This is parent process, %d\n", getpid());
    }
 
    return 1;
}

进行编译,输入gcc fork.c -o fork, 然后输入./fork,就会在console下面获得这样的结果

1
2
3
[root@localhost fork]# ./fork
This is child process, 2135
This is parent process, 2134

进程间通信

Linux系统本身为进程间通信提供了很多的方式,比如说管道、共享内存、socket通信等。管道的使用十分简单,在创建了匿名管道之后,我们只需要从一个管道发送数据,再从另外一个管道接受数据即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <stdio.h>  
#include <unistd.h>  
#include <stdlib.h>  
#include <string.h>  
 
int pipe_default[2];    
 
int main()  
{  
    pid_t pid;  
    char buffer[32];  
 
    memset(buffer, 0, 32);  
    if(pipe(pipe_default) < 0)  
    {  
        printf("Failed to create pipe!\n");  
        return 0;  
    }  
 
    if(0 == (pid = fork()))  
    {  
        close(pipe_default[1]);  
        sleep(5);  
        if(read(pipe_default[0], buffer, 32) > 0)  
        {  
            printf("Receive data from server, %s!\n", buffer);  
        }  
        close(pipe_default[0]);  
    }  
    else  
    {  
        close(pipe_default[0]);  
        if(-1 != write(pipe_default[1], "hello", strlen("hello")))  
        {  
            printf("Send data to client, hello!\n");  
        }  
        close(pipe_default[1]);  
        waitpid(pid, NULL, 0);  
    }  
 
    return 1;  
}

进行编译,输入gcc pipe.c -o pipe,然后输入./pipe,过一会儿你就可以看到下面的打印了

1
2
3
[test@localhost pipe]$ ./pipe  
Send data to client, hello!  
Receive data from server, hello!

参考文章:
linux下的C语言开发(进程创建)
linux下的C语言开发(进程等待)
linux下的C语言开发(管道通信)



本文出自 TENNFY WU,转载时请注明出处及相应链接。

本文永久链接: http://www.tennfy.com/4703.html

下一篇文章:

上一篇文章:

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

7 + 2 = ?


您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

返回顶部