多线程(1)

1、wait 函数

宏定义:WIFEXITED() WEXITSTATUS()

调用进程 一般不做额外的事情

复制代码
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>

int main(int argc, const char *argv[])
{
	pid_t pid = fork();

	if (-1 == pid)
	{
		perror("fork fail");
		return -1;
	}
	if (pid > 0)
	{
		int status;
		printf("father ----\n");
		wait(&status);
		printf("status = %d\n",status);

		if (WIFEXITED(status))
		{
			printf("status = %d\n",WEXITSTATUS(status));
		}

	}else if (pid == 0)
	{
		printf("child exit \n");
		exit(256);
	}	
	return 0;
}

2、waitpid 函数

调用进程 逻辑一般不受影响

注意:waitpid 想要处理到子进程必须套在循环中

3、pthread_库函数

(1)创建线程

(2)获取线程的tid

(3)pthread_join函数:等待线程结束

创建结束线程

复制代码
#include <stdio.h>
#include <pthread.h>
#include <errno.h>
#include <unistd.h>

void * do_something(void *arg)
{
	static int a = 10;
	//线程的任务函数 
	printf("------do_something ---- \n");

	//pthread_exit(NULL);
	pthread_exit(&a);
	//pthread_exit((void *)a);
}

int main(int argc, const char *argv[])
{
	pthread_t tid;
	int ret = pthread_create(&tid,NULL,do_something,NULL);

	if (ret != 0)
	{
		errno = ret;
		perror("pthread_create fail");
		return -1;
	}

	//sleep(3);
   void *retval; 
	//pthread_join(tid,&retval);
	pthread_join(tid,&retval);


	printf("---- main----%d\n",*(int *)retval);
//	printf("---- main----%d\n",(int)retval);

	pthread_exit(NULL);

	return 0;
}

#include <stdio.h>
#include <pthread.h>
#include <errno.h>
#include <unistd.h>

void * do_something1(void *arg)
{
	int *p = arg;
	//((int)(*arg))+=1;
	int a = *p;
	while (1)
	{
		//线程的任务函数 
		printf("------do_something1 ---- tid = %ld a = %d\n",pthread_self(),a++);
		sleep(1);
	}
}

void * do_something2(void *arg)
{
	int *p = arg;
   //线程的任务函数 
   int a = *p;
   while (1)
   {
	   a += 2;
		printf("------do_something2 ---- tid = %ld a = %d\n",pthread_self(),a);
		sleep(1);
   }
}

int main(int argc, const char *argv[])
{
	int a = 10;

	pthread_t tid1;
	int ret = pthread_create(&tid1,NULL,do_something1,&a);

	if (ret != 0)
	{
		errno = ret;
		perror("pthread_create fail");
		return -1;
	}

	pthread_t tid2;
	ret = pthread_create(&tid2,NULL,do_something2,&a );

	if (ret != 0)
	{
		errno = ret;
		perror("pthread_create fail");
		return -1;
	}

   //main do something 

	while (1)
	{
		printf("----main-----do_something--tid = %ld-\n",pthread_self());
		sleep(1);
	}


	sleep(3);
	
	return 0;
}
相关推荐
程序猿老A25 分钟前
轻量应用服务器怎么搭建 WordPress站点?
服务器
Wang's Blog30 分钟前
Java 项目实战: 交友项目 - 项目:需求分析与滑动数据设计
java·开发语言·交友
m0_7436975936 分钟前
DNS的反向域名的相关问题
linux
前端 贾公子1 小时前
第 5 章:Codex 从可运行程序到可交付工具
java·前端·数据库
snysy1 小时前
服务器安全加固与入侵检测实战:从SSH加固、防火墙策略到挖矿木马排查
服务器·安全·ssh
Android系统攻城狮1 小时前
Linux FFmpeg深度解析之avcodec_parameters_from_context调用流程与实战(十六)
linux·运维·ffmpeg·音视频进阶·ffmpeg音视频·车载音视频进阶
CoderYanger1 小时前
Java EE 进阶:5. Spring IoC&DI(第三弹):Spring DI
java·开发语言·spring boot·spring·面试·java-ee·mvc
思想觉悟1 小时前
SEAndroid实战
android·linux·c++
一条泥憨鱼1 小时前
【Kafka】零基础学习教程
java·分布式·学习·kafka
Wang's Blog2 小时前
Java 项目实战:交友项目 - 即时通信总结:全链路复盘、可复用清单与自检
java·python·交友