Linux真是垃圾中的极品啊

LuoMuFeng 2014-09-28 05:40:04
今天想要搞一个这样的功能,结果发现Linux根本搞不定:
是这样的:进程S是一个服务进程,长期运行。进程C是客户端进程,随时可能启动或中止,也可能同时启动多个。
进程C不定期要向进程S发送数据,要求进程S能正确接收这些数据。并且,如果进程C在数据未发送完成时被杀死,则进程S应该丢弃本次不完整的数据。
就这么简单,我想了各种办法,什么内存映射文件啊、什么命名管道啊、什么事件对象啊之类的,完全没有办法解决(千万不要说用Socket,我的电脑没有任何网络,本地回环地址127.0.0.1也没有)。最后不得不说,Linux真是垃圾中的极品啊!
...全文
5238 70 打赏 收藏 转发到动态 举报
写回复
用AI写文章
70 条回复
切换为时间正序
请发表友善的回复…
发表回复
superzmy凄临雨 2018-07-22
  • 打赏
  • 举报
回复
支持楼主,linux的多进程机制确实烂。 最后给楼主指一条明路,2013年以后pthread的mutex有个跨进程的属性且【另外有个属性是 PTHREAD_MUTEX_ROBUST】它会帮你在进程结束时释放这个锁。mutex本身要存在于共享内存上,共享内存创建时借助link来达到原子地初始化文件的目的。 有了这种锁以后,你可以在共享内存上放置N个跨进程锁,某些代表共享内存是否合理初始化,某些代表进程是否存在(于是不需要再启动第二个进程),并用共享内存上的bool值表示是否已处于工作状态,还是需要等待 这个功能2013年以前别想完美完成,必须要daemon之类的东西 接着楼上大部分是只听说linux牛逼,不知道这个功能就是做不了的低水平的人,linux的缺点多了去了
superzmy凄临雨 2018-07-22
  • 打赏
  • 举报
回复
支持楼主,linux的多进程机制确实烂。 最后给楼主指一条明路,2013年以后pthread的mutex有个跨进程的属性且【另外有个属性】好像是 PTHREAD_MUTEX_ROBUST 这个功能2013年以前别想完美完成,必须要daemon之类的东西 接着楼上大部分是只听说linux牛逼,不知道这个功能就是做不了的低水平的人,linux的缺点多了去了
qq_33234741 2015-12-03
  • 打赏
  • 举报
回复
这是非技术区
奋斗-少年 2015-12-03
  • 打赏
  • 举报
回复
那个说共享内存的回复: 是因为共享内存属于内核级别的对象,所以你在新建之后他的引用会增加,在都不使用之后引用会变成0,但是不代表会被马上销毁,内核会管理这个共享内存,他会自动销毁,你的代码里没有了不代表内核就必须销毁它,就像你的进程ID,进程退出来,ID暂时是不会释放的,回国一段时间才能用
wjcapple 2015-12-02
  • 打赏
  • 举报
回复
路过,来看看,楼主淡定
chhui000 2015-12-02
  • 打赏
  • 举报
回复
呵呵呵呵
西落兮 2015-11-27
  • 打赏
  • 举报
回复
shinerise 2015-11-20
  • 打赏
  • 举报
回复
linux is everything,linux is nothing...
JoeBlackzqq 2015-07-26
  • 打赏
  • 举报
回复
欠扁型的
RedWolf1999 2015-07-24
  • 打赏
  • 举报
回复
你简直是奇葩垃圾中的极品!!!!!
Kileny 2015-07-17
  • 打赏
  • 举报
回复
引用 14 楼 LuoMuFeng 的回复:
说得好像很厉害似的。我随便说一两点就足以证明linux是垃圾。 就拿共享内存来说吧,我用shmget,指定IPC_CREAT来创建了一块共享内存,又在另一个进程中打开该共享内存(不用IPC_CREAT)。然后,两个进程都退出了。按说这个共享内存应该销毁了吧?可它不,这垃圾linux一直把那共享内存留在那里,下次用shmget不用IPC_CREAT照样打开。你说郁不郁闷? 前面说的那些什么进程通信的功能我就不说了,这垃圾linux肯定是搞不了的。我只说个简单的功能: 我的程序有两个进程。B进程要依赖于A进程,因此,B进程每次启动时要先检查A进程是否存在。 就这个简单功能,这垃圾linux根本就搞不定。 本来还想用shmget,如果能打开,则认为A进程已经启动;如果打不开,则说明A进程未启动或已退出。谁知这垃圾linux居然把没用的对象长期保留。你让我如何不认为linux是垃圾中的极品?
楼主你好,我也是刚在学习IPC这一部分,看了你的想法,应该不是linux的问题,linux下的IPC一经创建,内核为之创建相对于OS的IPC对象,在系统未重启前或者手动(或系统调用)删除前会一直存在,另外创建IPC对象前都要ftok一个IPC对象的唯一一个键值key,ftok的两个参数,要确保第一个参数的文件是不会经常变动的比如/etc/profile或者其他,否则得到的键值也会变化,当我们用这个键值创建一IPC时调用&get是有讲究的,如你例中所说创建共享内存shmget(key,shm_size,IPC_CREAT|IPC_EXCL|mode),IPC_CREAT|IPC_EXCL,参数的组合使用是说当这个IPC对象不存在时则创建,如果已经存在刚返回-1,同时errno被置为EEXSIT,所以这个函数调用处理可如下 if((shmid=shmget(shmkey,shm_size,IPC_CREAT|IPC_EXCL|mode))==-1){ if(error != EEXSIT){ //创建失败 perror("shmget"); exit(1); } if((shmid=shmget(shmkey,shm_size,0)==-1){ //已经存在,读取共享内存描述符 perror("shmget"); exit(2); } } 取得了共享内存描述符,以供后文使用,这样基本上已经能处理楼主的需要了,下面要用共享内存之前要先用shmat将共享内存映射至调用进程的地址空间,用完了要shmdt共享内存映射,最后shmctl删除共享内存,希望以上对你有所帮助
todo9351 2015-06-30
  • 打赏
  • 举报
回复
哈哈哈,勾引贴,笑死了
LuoMuFeng 2015-06-25
  • 打赏
  • 举报
回复
Linux是垃圾中的极品,这是毫无疑问的。比如我说的那个问题:B进程在启动前先检查A进程是否存在,在Windows下的代码是这样的: A进程:
void main()
{
    CreateMutex(NULL,FALSE,"Process_A_Is_Running");
    //执行其他工作
}
B进程:
void main()
{
    if(OpenMutex(MUTEX_ALL_ACCESS,FALSE,"Process_A_Is_Running")==NULL)
    {
        printf("进程A未启动");
        return;
    }
    //执行其他工作
}
以上代码在Linux下如何实现?
jerision 2015-06-10
  • 打赏
  • 举报
回复
其实我是来看楼主被喷的
zjweiren 2015-03-29
  • 打赏
  • 举报
回复
程序员用什么编程语言不重要,重要的是能利用自己的编程特长赚到钱,Linux系统一样可以做外包,你可以看看这本书 《程序员接单宝典-第二版》,上面讲了很多外包的经验。这本书在CSDN上可以下载的,链接地址 http://download.csdn.net/detail/zjroland/8459335
我就是木暮 2015-03-27
  • 打赏
  • 举报
回复
那你别用啊。
LiuYinChina 2015-01-05
  • 打赏
  • 举报
回复
楼主,不要埋怨 Linux,你搞不定,说明你学得还不够!低调!
Wenxy1 2014-12-26
  • 打赏
  • 举报
回复
楼主被这个问题气得说糊话了。
wfwater 2014-12-21
  • 打赏
  • 举报
回复
楼主你改行吧,这碗饭你吃不下去的。
iceuct 2014-12-02
  • 打赏
  • 举报
回复
你没 socket 还好意思说用的是 Linux? 没有网络 世界上就不可能有 linux
加载更多回复(50)

427

社区成员

发帖
与我相关
我的任务
社区描述
非技术问题的乐园
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧