linux下的c语言编程编程问题

网络程序异常退出无core文件产生
这种情况发生在一边连接端已经关闭,但是另外一边还在对连接句柄做send操作,这样做send操作的进程会收到SIGPIPE信号,默认行为是直接退出且不会产生core。为了避免退出,一般在启动的时候加上 signal(SIGPIPE, SIG_IGN) 来忽略这种错误。
发送端send成功,但是接收端却recv失败
send只是表示数据copy到了发送缓冲区,并不代表数据到达了recv,若这时候网络出问题,对面确实收不到数据。
如何让接受方知道发送方每次发送的数据有多长
1. 和ip协议类似在每段发送的数据前拼接一个固定长度的包头,包头里存储数据长度类型等信息,接受方那边recv2次,第一次收包头,第二次根据包头里的长度申请空间收数据
2. 和http包头类似,已特殊标记符号为结尾,http是2个\r\n
服务端地址重用问题
服务端重启会被告知端口被占用,这是因为服务端主动调用了close操作。主动断开连接方的端口会在断开以后短时间处于TIME_WAIT状态,这时候端口不能被重用,解决办法是在setsockopt函数里面设置
为什么会出现TIME_WAIT
&四次挥手过程中,主动断开方收到对面的fin包以后要反发一个ack包回复(这是第四次挥手),发完ack以后要等待2个TIME_WAIT(60S)时间才关闭自己,原因是因为ack包会出现丢包的情况,如果出现,对面由于没收到ack可能又会重发fin包,而ack&&fin这一来一回的最长时间正好是2个TIME_WAIT时间,所以主动断开方在等待2个TIME_WAIT时间以后没收到fin就说明ack包已经正常到底对面连接
CLOSE_WAIT状态出现在什么时候
被动关闭方收到对面的fin包以后到发送自己的fin包这段时间网络会处于&CLOSE_WAIT状态,不过这段时间比较短,除非是自己这边网络异常不能关闭连接。
listen的backlog设置
listen里面维护2个队列,一个是已经连接完成的队列,这个长度为backlog,一个是未完成连接的队列,这个长度为backlog/2,accept取的是已完成队列里的句柄,如果accept取的不及时可能导致队列满,这样listen就会拒绝连接
阅读(...) 评论()3.4k 人阅读
标签:至少1个,最多5个
又是某课程的实验(感觉好烦啊啊。。。),这次终于不用编译内核了,但是但是,他让我们写多线程。好吧,那就写写写,但是等等。。他要我们实现生产者-消费者同步问题,要用信号量解决同步问题。。这几个都是什么鬼。。好吧,不懂的自行google吧。
话不多说,直接上代码,目前只是简易实现,可能会有问题,大家可以指出啊,我虚心受教~~
windows线程
//包含必须头文件
#include&windows.h&
#include&stdio.h&
#include&stdlib.h&
#include &time.h&
//定义相关结构
#define BUFFER_SIZE 5
typedef int buffer_
//相关信号量的声明以及buffer的声明
HANDLE empty,
buffer_item buffer[BUFFER_SIZE]={-1};
int count = 0;
//向buffer中插入元素函数
int insert_item(buffer_item item){
WaitForSingleObject(empty,INFINITE);
WaitForSingleObject(mutex,INFINITE);
int state = 0;
printf("now count is %d in insert\n",count);
if(buffer[count]!=-1)
state = 1;
buffer[count] =
count = (count+1)%BUFFER_SIZE;
ReleaseMutex(mutex);
ReleaseSemaphore(full,1,NULL);
printf("now release in insert\n");
return -1;
//向buffer中删除元素函数
int remove_item(buffer_item *item){
WaitForSingleObject(full,INFINITE);
WaitForSingleObject(mutex,INFINITE);
int state = 0;
printf("now count is %d in remove\n",count);
if(count&0)
count = count-1;
count = 4;
if(buffer[count]!=-1){
buffer[count] = -1;
state = 1;
ReleaseMutex(mutex);
ReleaseSemaphore(empty,1,NULL);
printf("now release in remove\n");
return -1;
//生产者进程函数
void *producer(void *param){
srand((unsigned)time(NULL));
while(TRUE){
randb = rand();
sleep(rand()%1000);
printf("now produce want to produce %d \n",randb);
if(insert_item(randb)){
printf("report error condition of producer\n");
printf("producer produced %d\n",randb);
//消费者进程函数
void *consumer(void *param){
sleep(1000);
srand((unsigned)time(NULL));
while(TRUE){
randb= rand();
sleep(rand()%1000);
printf("now consume want to consume %d \n",randb);
if(remove_item(&randb))
printf("report error condition of consume\n");
printf("consume consumed %d\n",randb);
//mian函数
int main(int argc,char *argv[])
mutex = CreateMutex(NULL,FALSE,NULL);
empty = CreateSemaphore(NULL,4,4,NULL);
full = CreateSemaphore(NULL,0,4,NULL);
DWORD ThreadIdOfC
DWORD ThreadIdOfP
HANDLE ThreadHandleOfC
HANDLE ThreadHandleOfP
int Param = 10;
ThreadHandleOfConsumer= CreateThread(
&consumer,
&ThreadIdOfConsumer);
ThreadHandleOfProducer= CreateThread(
&producer,
&ThreadIdOfProducer);
if(ThreadHandleOfConsumer!=NULL&&ThreadHandleOfProducer!=NULL){
sleep(5000);
TerminateThread(ThreadHandleOfConsumer,0);
TerminateThread(ThreadHandleOfProducer,0);
CloseHandle(ThreadHandleOfConsumer);
CloseHandle(ThreadHandleOfProducer);
system("pause");
原谅我把全部写在一起了。。不过你们能懂就好啊
贴下结果:
#include&pthread.h&
#include&stdio.h&
#include&stdlib.h&
#include&time.h&
#include&semaphore.h&
#define BUFFER_SIZE 5
typedef int buffer_
pthread_mutex_
sem_t empty,
buffer_item buffer[BUFFER_SIZE]={-1,-1,-1,-1,-1};
int count = 0;
int insert_item(buffer_item item){
sem_wait(&empty);
pthread_mutex_lock(&mutex);
int state = 0;
printf("now count is %d in insert\n",count);
if(buffer[count]!=-1){
printf("error and buffer[count]==%d",buffer[count]);
state = 1;
buffer[count] =
count = (count+1)%BUFFER_SIZE;
pthread_mutex_unlock(&mutex);
sem_post(&full);
printf("now release in insert\n");
return -1;
int remove_item(buffer_item *item){
sem_wait(&full);
pthread_mutex_lock(&mutex);
int state = 0;
printf("now count is %d in remove\n",count);
if(count&0)
count = count-1;
count = 4;
if(buffer[count]!=-1){
buffer[count] = -1;
state = 1;
pthread_mutex_unlock(&mutex);
sem_post(&empty);
printf("now release in remove\n");
return -1;
void *producer(void *param){
srand((unsigned)time(NULL));
randb = rand();
sleep(rand()%2);
printf("now produce want to produce %d \n",randb);
if(insert_item(randb)){
printf("report error condition of producer\n\n");
printf("producer produced %d\n\n",randb);
void *consumer(void *param){
srand((unsigned)time(NULL));
randb= rand();
sleep(rand()%2);
printf("now consume want to consume %d \n",randb);
if(remove_item(&randb))
printf("report error condition of consume\n\n");
printf("consume consumed %d\n\n",randb);
int main(int argc,char *argv[])
printf("start\n");
pthread_mutex_init(&mutex,NULL);
sem_init(&empty,4,4);
sem_init(&full,0,4);
pthread_t ThreadIdOfC
pthread_t ThreadIdOfP
pthread_attr_t ThreadHandleOfC
pthread_attr_t ThreadHandleOfP
int Param = 10;
pthread_attr_init(&ThreadHandleOfConsumer);
pthread_attr_init(&ThreadHandleOfProducer);
pthread_create(&ThreadIdOfConsumer,&ThreadHandleOfConsumer,consumer,NULL);
pthread_create(&ThreadIdOfProducer,&ThreadHandleOfProducer,producer,NULL);
//pthread_join(ThreadIdOfConsumer,NULL);
//pthread_join(ThreadIdOfProducer,NULL);
pthread_kill(ThreadIdOfConsumer,0);
pthread_kill(ThreadIdOfProducer,0);
还有几张就不想贴了。可以自己运行试试
在这里向提示几个坑,以免大家跳入:
关于rand函数的使用,其实我真心不觉得那个很随机,虽然你用下srand取得的效果还能接受吧,但是记得用srand吧,不然只能说每次都一样的序列了。。
关于sleep函数的使用。windows下5000单位是毫秒,所以是5秒,刚开始没注意,直接copy到linux下,然后。。就没有然后了。。程序半天没有结果。。我还以为写错了呢。。后来发现原来linux下单位是秒,所以5000就是5000秒。。难怪我等不到结果。。
关于linux下程序的编译执行,后面要记得加上参数,具体参数见图,反正我不加编译时会报错,提示你semaphore里的很多函数没有定义之类的,加上就好了,这个也有可能是我这边自己的问题吧。
最后,假如有人要写类似的可以做个参考吧,那些线程啥的用封装好的用习惯了,刚开始用基层的真还有点不习惯呢。百忙花个时间来作个死。。你猜下次某课实验是啥~~
1 收藏&&|&&1
你可能感兴趣的文章
互斥锁意义何在?
互斥锁意义何在?
你可能感兴趣的文章
分享到微博?
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。为什么要用Linux系统进行编程_百度知道
为什么要用Linux系统进行编程
我有更好的答案
Linux之前都是命令行操作系统(后来又图形界面),有大量的开源数据库,系统本省占用的资源极少,开发一些程序会比较方便。但并不是说一定要用linux,很多程序也只能在windows平台下开发,这跟微软的一些比较损的垄断有关。就像Mac适合多媒体开发一样,只是长处罢了。
采纳率:49%
码,仅仅是表层的东西,一个hello world算什么。。。根本没涉及到操作系统的特性层面去。你说的编译、调试、运行,这个根本就不是问题,现在编译器到处都是,IDE也各种各样,还夸平台。你写点深入操作系统内核的代码就知道了(其实我也没写过多少程序,但是我写过一点点Linux的程序,觉得不难入门,至少加载驱动就很简单)。Linux之所以容易开发,因为他系统模型比较容易理解...所以很多人说,Linux是简单的系统,经典的操作系统原理也是用unix(Linux是类unix系统而来)来讲的,好像没有书直接用windows来做模型讲操作系统。其实Linux才是好用的,慢慢配置熟悉了,什么都能配置。可windows,你觉得你在界面操作很熟悉,但是你没办法想配置Linux那样来配置你的windows。这个是我的感觉而已,没做过什么开发。另外,虚机团上产品团购,超级便宜
Linux系统精简,运行稳定,而且系统源代码公开。对于针对操作系统调试程序有很大的便利之处。
要看你干什么啦!linux下编程的好处是开源和命令行环境,当然命令行也被说成是缺点,但我认为编程最好还是在命令行环境下
为什么我们吃饭时要用筷子,用刀叉也是可以的嘛。
DDDDDDDDDDDD
其他3条回答
为您推荐:
其他类似问题
您可能关注的内容
linux系统的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。关于Linux下的编程几个小问题?_百度知道
关于Linux下的编程几个小问题?
1. linux下可以使同样的代码运行更快吗?比如for(int i = 0 ; i & 100000 ; i ++)这句话在linux下和windows下的执行时间是不是相等。2. linux下定时是否更准确?比如windows下timer在定时几十毫秒时的误差比较大,在linux下是不是精度更高。
我有更好的答案
不会,主要看CPU频率等硬件参数有可能,但也看情况,VxWorks这种实时性操作系统响应最快
采纳率:70%
来自团队:
为您推荐:
其他类似问题
您可能关注的内容
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。没有更多推荐了,
不良信息举报
举报内容:
Linux下多线程编程遇到的一些问题
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!}

我要回帖

更多关于 linux下串口编程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信