⑴ linux消息队列出错argument list too long
它已经告诉你,是因为“参数列表太长”导致的错误。所以需要看看你的哪个参数太长,并且想办法减少参数个数。
比如一个非常非常多文件(比如有超过一百万个文件)的目录,直接用 rm -f * 时,可能就会出这个提示。那可以换一个方法,一次不给 rm 命令太多参数(这里是文件名),就可以逐一删除。一般会用以下命令逐一查找后再执行删除。
find . -name *.* -ok rm {} \;
⑵ 简述Linux进程间通信的几种方式
一、方式1、管道(Pipe)及有名管道(mkpipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;2信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身。
linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction。
实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数。
3、消息队列(Message):消息队列是消息的链接表,包括Posix消息队列systemV消息队列。
有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。
消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
4、共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。
是针对其他通信机制运行效率较低而设计的。
往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
5、信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。
6、套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。
起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和SystemV的变种都支持套接字。
二、概念进程间通信概念:IPC—-InterProcessCommunication 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到所以进程之间要交换数据必须通过内核。
在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信。(2)linux内核消息队列扩展阅读1)无名管道:管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程)。
管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,构成两进程间通信的一个媒介。
数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。
写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。
2)有名管道:不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中。
这样,即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过FIFO相互通信(能够访问该路径的进程以及FIFO的创建进程之间)。
因此,通过FIFO不相关的进程也能交换数据。值得注意的是,FIFO严格遵循先进先出(firstinfirstout),对管道及FIFO的读总是从开始处返回数据,对它们的写则把数据添加到末尾。
它们不支持诸如lseek()等文件定位操作。
⑶ linux 进程通信方式 pipe无名管道 fifo有名管道 共享内存映射 socket 消息队列
在Linux系统中,进程间的通信(IPC, Inter-Process Communication)主要通过四种机制实现:管道(pipe)、有名管道(fifo)、共享内存映射以及Unix域socket。这些方法各自适用于不同的场景,让进程能够有效地交换数据。
1. 管道(pipe):无名管道,由`pipe()`函数创建,适合于有血缘关系的进程间通信,如父子进程。它在内核中创建一个缓冲区,通过`filedes`参数传递给用户进程,用于单向通信,数据写满后会阻塞。
2. 有名管道(fifo):解决无血缘关系进程间的通信,使用`mkfifo`创建,相当于磁盘上的一个文件,通过文件名访问。它实质上是基于管道的,只是给管道起了个名字,读写需要进程都打开文件。
3. 共享内存映射(mmap):通过`mmap`函数将磁盘文件的一部分映射到内存,支持同步修改(share映射)和独立修改(private映射)。这常用于进程间的数据传递,特别是权限受限的情况下。
4. Unix域socket(socket):利用网络通信技术,适用于远程进程间的通信,常用于服务器-客户端模型,数据按照协议解析。
消息队列,虽然视频中未提及,但它是另一种间接通信方式,类似于邮箱系统,接收方根据消息类型从中间体获取信息。消息队列提供了一种独立于进程运行状态的通信方式,写入者无需关心接收者是否在读取。
每种方法都有其优缺点,选择哪种取决于具体的应用场景和性能需求。理解这些通信方式有助于编写高效、可靠的多进程应用程序。
⑷ 请教一个关于linux消息队列的问题
一般使用步骤:
1. 用ftok产生一个key。
2. 调用msgget(使用key作为参数)产生一个队列
3. 进程可以用msgsnd发送消息到这个队列,相应的别的进程用msgrcv读取。
这里需要注意msgsnd可能会失败的两个情况:
a) 可能被中断打断(包括msgsnd和msgrcv). 尤其是大流量应用中更容易出现. 比较安全的用法是判断操作是否被中断打断,如果被打断, 则需要继续尝试。
b) 消息队列满。产生这个错误,则需要考虑提高系统消息队列规格,或者查看消息接收处是否有问题
4. msgctl函数可以用来删除消息队列
消息队列产生之后,除非明确的删除(可以用),产生的队列会一直保留在系统中。linux下消息队列的个数是有限的,注意不要泄露。如果 使用已经达到上限,msgget调用会失败,产生的错误码对应的提示信息为no space left on device.
注意点:
1.消息的类型 mtype 不需为非0值。如果使用0,则msgsnd会失败,并得到”Invalid argument“错误。
2.msgflg为0表示阻塞等待,如果msgflg为IPC_NOWAIT表示非阻塞。
3.最好使用root权限执行消息队列,否则msgrcv 提示 "Permission denied"。
⑸ linux系统下进程通信的6种方式分别是什么它们的区别在什么地方线程通信有几种方式这是很多人的疑问
管道:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
信号量 :信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
消息队列:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
信号 :
信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
共享内存:共享内存就是映射一段能被其他进程所访问的内存,这段共享内由一个进程创建,多个进程都可以访问。共享内存是最快的IPC 方式,
它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,合使用,来实现进程间的同步和通信。
套接字: 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信
管道可以用于shell重定向,也就是命令管道类似grep
命名管道可以实现通信,通过makefifo传递消息
消息队列也可以实现通信,不过相比命名管道有消息过滤的好处
信号其实就是KILL的应用
信号量是对临界共享资源的合理调度
共享内存, 就是字面意思共享的内存
而线程通信方式有:互斥锁,条件变量,读写锁