- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在 Cocoa 应用程序中使用 UNIX 域套接字实现 IPC,但我对此没有经验。我找到了苹果的CFLocalServer示例项目,但它是用 C 编写的,看起来相当复杂(是的,我已经阅读了其中的大部分内容)。
CFLocalServer 中演示的技术是否仍然是最先进的,或者是否有办法使用 Cocoa/Foundation 在 Objective-C 中实现 UNIX 域套接字?
我正在使用 NSSocketPort
和 NSFileHandle
(它们提供了大量的抽象,这对于这个项目来说非常有用)并发现了一些非常相关的代码在 Mike Bean's Networking in Cocoa ,但还未能使其全部发挥作用。
以前有人这样做过吗?
最佳答案
UNIX 域套接字是一个很难捕获的坚果。对于还没有这样做过但有兴趣的人来说,那就去吧。事后会有一种成就感。然而,即使有来自 Beej 和该网站甚至来自 Apple 的信息,仍然存在许多脱节。我在这里展示了一个启用了 ARC 的 Cocoa 的结论性示例。我一直在等待西德尼厄斯和他的样本,但从未看到任何东西,所以我决定自己解决这个问题。
我这里有一个 header 和具有三个接口(interface)的 .m 实现文件。一个父类(super class)接口(interface),然后是继承的服务器和客户端接口(interface)。我做了一些有限的测试,看起来效果很好。然而,我们一直在寻求改进,所以请告诉我...
头文件:
typedef enum _CommSocketServerStatus {
CommSocketServerStatusUnknown = 0,
CommSocketServerStatusRunning = 1,
CommSocketServerStatusStopped = 2,
CommSocketServerStatusStarting = 3,
CommSocketServerStatusStopping = 4
} CommSocketServerStatus;
typedef enum _CommSocketClientStatus {
CommSocketClientStatusUnknown = 0,
CommSocketClientStatusLinked = 1,
CommSocketClientStatusDisconnected = 2,
CommSocketClientStatusLinking = 3,
CommSocketClientStatusDisconnecting = 4
} CommSocketClientStatus;
@class CommSocketServer, CommSocketClient;
@protocol CommSocketServerDelegate <NSObject>
@optional
- (void) handleSocketServerStopped:(CommSocketServer *)server;
- (void) handleSocketServerMsgURL:(NSURL *)aURL fromClient:(CommSocketClient *)client;
- (void) handleSocketServerMsgString:(NSString *)aString fromClient:(CommSocketClient *)client;
- (void) handleSocketServerMsgNumber:(NSNumber *)aNumber fromClient:(CommSocketClient *)client;
- (void) handleSocketServerMsgArray:(NSArray *)aArray fromClient:(CommSocketClient *)client;
- (void) handleSocketServerMsgDict:(NSDictionary *)aDict fromClient:(CommSocketClient *)client;
@end
@protocol CommSocketClientDelegate <NSObject>
@optional
- (void) handleSocketClientDisconnect:(CommSocketClient *)client;
- (void) handleSocketClientMsgURL:(NSURL *)aURL client:(CommSocketClient *)client;
- (void) handleSocketClientMsgString:(NSString *)aString client:(CommSocketClient *)client;
- (void) handleSocketClientMsgNumber:(NSNumber *)aNumber client:(CommSocketClient *)client;
- (void) handleSocketClientMsgArray:(NSArray *)aArray client:(CommSocketClient *)client;
- (void) handleSocketClientMsgDict:(NSDictionary *)aDict client:(CommSocketClient *)client;
@end
@interface CommSocket : NSObject
@property (readonly, nonatomic, getter=isSockRefValid) BOOL sockRefValid;
@property (readonly, nonatomic, getter=isSockConnected) BOOL sockConnected;
@property (readonly, nonatomic) CFSocketRef sockRef;
@property (readonly, strong, nonatomic) NSURL *sockURL;
@property (readonly, strong, nonatomic) NSData *sockAddress;
@property (readonly, strong, nonatomic) NSString *sockLastError;
@end
@interface CommSocketServer : CommSocket <CommSocketClientDelegate> { id <CommSocketServerDelegate> delegate; }
@property (readwrite, strong, nonatomic) id delegate;
@property (readonly, strong, nonatomic) NSSet *sockClients;
@property (readonly, nonatomic) CommSocketServerStatus sockStatus;
@property (readonly, nonatomic) BOOL startServer;
@property (readonly, nonatomic) BOOL stopServer;
- (id) initWithSocketURL:(NSURL *)socketURL;
+ (id) initAndStartServer:(NSURL *)socketURL;
- (void) addConnectedClient:(CFSocketNativeHandle)handle;
- (void) messageClientsURL:(NSURL *)aURL;
- (void) messageClientsString:(NSString *)aString;
- (void) messageClientsNumber:(NSNumber *)aNumber;
- (void) messageClientsArray:(NSArray *)aArray;
- (void) messageClientsDict:(NSDictionary *)aDict;
@end
@interface CommSocketClient : CommSocket { id <CommSocketClientDelegate> delegate; }
@property (readwrite, strong, nonatomic) id delegate;
@property (readonly, nonatomic) CommSocketClientStatus sockStatus;
@property (readonly, nonatomic) CFRunLoopSourceRef sockRLSourceRef;
@property (readonly, nonatomic) BOOL startClient;
@property (readonly, nonatomic) BOOL stopClient;
- (id) initWithSocketURL:(NSURL *)socketURL;
- (id) initWithSocket:(CFSocketNativeHandle)handle;
+ (id) initAndStartClient:(NSURL *)socketURL;
+ (id) initWithSocket:(CFSocketNativeHandle)handle;
- (void) messageReceived:(NSData *)data;
- (BOOL) messageURL:(NSURL *)aURL;
- (BOOL) messageString:(NSString *)aString;
- (BOOL) messageNumber:(NSNumber *)aNumber;
- (BOOL) messageArray:(NSArray *)aArray;
- (BOOL) messageDict:(NSDictionary *)aDict;
@end
实现文件:(我将分三部分介绍)
第一部分(父类(super class))
#import "CommSocket.h"
#import <sys/un.h>
#import <sys/socket.h>
#pragma mark Socket Superclass:
@interface CommSocket ()
@property (readwrite, nonatomic) CFSocketRef sockRef;
@property (readwrite, strong, nonatomic) NSURL *sockURL;
@end
@implementation CommSocket
@synthesize sockConnected;
@synthesize sockRef, sockURL;
- (BOOL) isSockRefValid {
if ( self.sockRef == nil ) return NO;
return (BOOL)CFSocketIsValid( self.sockRef );
}
- (NSData *) sockAddress {
struct sockaddr_un address;
address.sun_family = AF_UNIX;
strcpy( address.sun_path, [[self.sockURL path] fileSystemRepresentation] );
address.sun_len = SUN_LEN( &address );
return [NSData dataWithBytes:&address length:sizeof(struct sockaddr_un)];
}
- (NSString *) sockLastError {
return [NSString stringWithFormat:@"%s (%d)", strerror( errno ), errno ];
}
@end
第二节(服务器)
注意:服务器重用连接到自身的客户端的客户端代码。面向对象编程,一定会喜欢它!
#pragma mark - Socket: Server
#pragma mark -
@interface CommSocketServer ()
@property (readonly, nonatomic) BOOL startServerCleanup;
@property (readwrite, nonatomic) CommSocketServerStatus sockStatus;
@property (readwrite, strong, nonatomic) NSSet *sockClients;
static void SocketServerCallback (CFSocketRef sock, CFSocketCallBackType type, CFDataRef address, const void *data, void *info);
@end
#pragma mark - Server Implementation:
@implementation CommSocketServer
@synthesize delegate;
@synthesize sockStatus;
@synthesize sockClients;
#pragma mark - Helper Methods:
- (BOOL) socketServerCreate {
if ( self.sockRef != nil ) return NO;
CFSocketNativeHandle sock = socket( AF_UNIX, SOCK_STREAM, 0 );
CFSocketContext context = { 0, (__bridge void *)self, nil, nil, nil };
CFSocketRef refSock = CFSocketCreateWithNative( nil, sock, kCFSocketAcceptCallBack, SocketServerCallback, &context );
if ( refSock == nil ) return NO;
int opt = 1;
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void *)&opt, sizeof(opt));
setsockopt(sock, SOL_SOCKET, SO_NOSIGPIPE, (void *)&opt, sizeof(opt));
self.sockRef = refSock;
CFRelease( refSock );
return YES;
}
- (BOOL) socketServerBind {
if ( self.sockRef == nil ) return NO;
unlink( [[self.sockURL path] fileSystemRepresentation] );
if ( CFSocketSetAddress(self.sockRef, (__bridge CFDataRef)self.sockAddress) != kCFSocketSuccess ) return NO;
return YES;
}
#pragma mark - Connected Clients:
- (void) disconnectClients {
for ( CommSocketClient *client in self.sockClients )
[client stopClient];
self.sockClients = [NSSet set];
}
- (void) disconnectClient:(CommSocketClient *)client {
@synchronized( self ) {
NSMutableSet *clients = [NSMutableSet setWithSet:self.sockClients];
if ( [clients containsObject:client] ) {
if ( client.isSockRefValid ) [client stopClient];
[clients removeObject:client];
self.sockClients = clients;
} }
}
- (void) addConnectedClient:(CFSocketNativeHandle)handle {
@synchronized( self ) {
CommSocketClient *client = [CommSocketClient initWithSocket:handle];
client.delegate = self;
NSMutableSet *clients = [NSMutableSet setWithSet:self.sockClients];
if ( client.isSockConnected ) {
[clients addObject:client];
self.sockClients = clients;
} }
}
#pragma mark - Connected Client Protocols:
- (void) handleSocketClientDisconnect:(CommSocketClient *)client {
[self disconnectClient:client];
}
- (void) handleSocketClientMsgURL:(NSURL *)aURL client:(CommSocketClient *)client {
if ( [self.delegate respondsToSelector:@selector(handleSocketServerMsgURL:server:fromClient:)] )
[self.delegate handleSocketServerMsgURL:aURL fromClient:client];
}
- (void) handleSocketClientMsgString:(NSString *)aString client:(CommSocketClient *)client {
if ( [self.delegate respondsToSelector:@selector(handleSocketServerMsgString:fromClient:)] )
[self.delegate handleSocketServerMsgString:aString fromClient:client];
}
- (void) handleSocketClientMsgNumber:(NSNumber *)aNumber client:(CommSocketClient *)client {
if ( [self.delegate respondsToSelector:@selector(handleSocketServerMsgNumber:fromClient:)] )
[self.delegate handleSocketClientMsgNumber:aNumber client:client];
}
- (void) handleSocketClientMsgArray:(NSArray *)aArray client:(CommSocketClient *)client {
if ( [self.delegate respondsToSelector:@selector(handleSocketServerMsgArray:fromClient:)] )
[self.delegate handleSocketServerMsgArray:aArray fromClient:client];
}
- (void) handleSocketClientMsgDict:(NSDictionary *)aDict client:(CommSocketClient *)client {
if ( [self.delegate respondsToSelector:@selector(handleSocketServerMsgDict:fromClient:)] )
[self.delegate handleSocketServerMsgDict:aDict fromClient:client];
}
#pragma mark - Connected Client Messaging:
- (void) messageClientsURL:(NSURL *)aURL {
for ( CommSocketClient *client in self.sockClients)
[client messageURL:aURL];
}
- (void) messageClientsString:(NSString *)aString {
for ( CommSocketClient *client in self.sockClients)
[client messageString:aString];
}
- (void) messageClientsNumber:(NSNumber *)aNumber {
for ( CommSocketClient *client in self.sockClients)
[client messageNumber:aNumber];
}
- (void) messageClientsArray:(NSArray *)aArray {
for ( CommSocketClient *client in self.sockClients)
[client messageArray:aArray];
}
- (void) messageClientsDict:(NSDictionary *)aDict {
for ( CommSocketClient *client in self.sockClients)
[client messageDict:aDict];
}
#pragma mark - Start / Stop Server:
- (BOOL) startServerCleanup { [self stopServer]; return NO; }
- (BOOL) startServer {
if ( self.sockStatus == CommSocketServerStatusRunning ) return YES;
self.sockStatus = CommSocketServerStatusStarting;
if ( ![self socketServerCreate] ) return self.startServerCleanup;
if ( ![self socketServerBind] ) return self.startServerCleanup;
CFRunLoopSourceRef sourceRef = CFSocketCreateRunLoopSource( kCFAllocatorDefault, self.sockRef, 0 );
CFRunLoopAddSource( CFRunLoopGetCurrent(), sourceRef, kCFRunLoopCommonModes );
CFRelease( sourceRef );
self.sockStatus = CommSocketServerStatusRunning;
return YES;
}
- (BOOL) stopServer {
self.sockStatus = CommSocketServerStatusStopping;
[self disconnectClients];
if ( self.sockRef != nil ) {
CFSocketInvalidate(self.sockRef);
self.sockRef = nil;
}
unlink( [[self.sockURL path] fileSystemRepresentation] );
if ( [self.delegate respondsToSelector:@selector(handleSocketServerStopped:)] )
[self.delegate handleSocketServerStopped:self];
self.sockStatus = CommSocketServerStatusStopped;
return YES;
}
#pragma mark - Server Validation:
- (BOOL) isSockConnected {
if ( self.sockStatus == CommSocketServerStatusRunning )
return self.isSockRefValid;
return NO;
}
#pragma mark - Initialization:
+ (id) initAndStartServer:(NSURL *)socketURL {
CommSocketServer *server = [[CommSocketServer alloc] initWithSocketURL:socketURL];
[server startServer];
return server;
}
- (id) initWithSocketURL:(NSURL *)socketURL {
if ( (self = [super init]) ) {
self.sockURL = socketURL;
self.sockStatus = CommSocketServerStatusStopped;
self.sockClients = [NSSet set];
} return self;
}
- (void) dealloc { [self stopServer]; }
#pragma mark - Server Callback:
static void SocketServerCallback (CFSocketRef sock, CFSocketCallBackType type, CFDataRef address, const void *data, void *info) {
CommSocketServer *server = (__bridge CommSocketServer *)info;
if ( kCFSocketAcceptCallBack == type ) {
CFSocketNativeHandle handle = *(CFSocketNativeHandle *)data;
[server addConnectedClient:handle];
}
}
@end
第三节(客户)
#pragma mark - Socket: Client
#pragma mark -
@interface CommSocketClient ()
@property (readonly, nonatomic) BOOL startClientCleanup;
@property (readwrite, nonatomic) CommSocketClientStatus sockStatus;
@property (readwrite, nonatomic) CFRunLoopSourceRef sockRLSourceRef;
static void SocketClientCallback (CFSocketRef sock, CFSocketCallBackType type, CFDataRef address, const void *data, void *info);
@end
#pragma mark - Client Implementation:
@implementation CommSocketClient
static NSTimeInterval const kCommSocketClientTimeout = 5.0;
@synthesize delegate;
@synthesize sockStatus;
@synthesize sockRLSourceRef;
#pragma mark - Helper Methods:
- (BOOL) socketClientCreate:(CFSocketNativeHandle)sock {
if ( self.sockRef != nil ) return NO;
CFSocketContext context = { 0, (__bridge void *)self, nil, nil, nil };
CFSocketCallBackType types = kCFSocketDataCallBack;
CFSocketRef refSock = CFSocketCreateWithNative( nil, sock, types, SocketClientCallback, &context );
if ( refSock == nil ) return NO;
int opt = 1;
setsockopt(sock, SOL_SOCKET, SO_NOSIGPIPE, (void *)&opt, sizeof(opt));
self.sockRef = refSock;
CFRelease( refSock );
return YES;
}
- (BOOL) socketClientBind {
if ( self.sockRef == nil ) return NO;
if ( CFSocketConnectToAddress(self.sockRef,
(__bridge CFDataRef)self.sockAddress,
(CFTimeInterval)kCommSocketClientTimeout) != kCFSocketSuccess ) return NO;
return YES;
}
#pragma mark - Client Messaging:
- (void) messageReceived:(NSData *)data {
id msg = [NSKeyedUnarchiver unarchiveObjectWithData:data];
if ( [msg isKindOfClass:[NSURL class]] ) {
if ( [self.delegate respondsToSelector:@selector(handleSocketClientMsgURL:client:)] )
[self.delegate handleSocketClientMsgURL:(NSURL *)msg client:self];
}
else if ( [msg isKindOfClass:[NSString class]] ) {
if ( [self.delegate respondsToSelector:@selector(handleSocketClientMsgString:client:)] )
[self.delegate handleSocketClientMsgString:(NSString *)msg client:self];
}
else if ( [msg isKindOfClass:[NSNumber class]] ) {
if ( [self.delegate respondsToSelector:@selector(handleSocketClientMsgNumber:client:)] )
[self.delegate handleSocketClientMsgNumber:(NSNumber *)msg client:self];
}
else if ( [msg isKindOfClass:[NSArray class]] ) {
if ( [self.delegate respondsToSelector:@selector(handleSocketClientMsgArray:client:)] )
[self.delegate handleSocketClientMsgArray:(NSArray *)msg client:self];
}
else if ( [msg isKindOfClass:[NSDictionary class]] ) {
if ( [self.delegate respondsToSelector:@selector(handleSocketClientMsgDict:client:)] )
[self.delegate handleSocketClientMsgDict:(NSDictionary *)msg client:self];
}
}
- (BOOL) messageData:(NSData *)data {
if ( self.isSockConnected ) {
if ( kCFSocketSuccess == CFSocketSendData(self.sockRef,
nil,
(__bridge CFDataRef)data,
kCommSocketClientTimeout) )
return YES;
} return NO;
}
- (BOOL) messageURL:(NSURL *)aURL { return [self messageData:[NSKeyedArchiver archivedDataWithRootObject:aURL]]; }
- (BOOL) messageString:(NSString *)aString { return [self messageData:[NSKeyedArchiver archivedDataWithRootObject:aString]]; }
- (BOOL) messageNumber:(NSNumber *)aNumber { return [self messageData:[NSKeyedArchiver archivedDataWithRootObject:aNumber]]; }
- (BOOL) messageArray:(NSArray *)aArray { return [self messageData:[NSKeyedArchiver archivedDataWithRootObject:aArray]]; }
- (BOOL) messageDict:(NSDictionary *)aDict { return [self messageData:[NSKeyedArchiver archivedDataWithRootObject:aDict]]; }
#pragma mark - Start / Stop Client:
- (BOOL) startClientCleanup { [self stopClient]; return NO; }
- (BOOL) startClient {
if ( self.sockStatus == CommSocketClientStatusLinked ) return YES;
self.sockStatus = CommSocketClientStatusLinking;
CFSocketNativeHandle sock = socket( AF_UNIX, SOCK_STREAM, 0 );
if ( ![self socketClientCreate:sock] ) return self.startClientCleanup;
if ( ![self socketClientBind] ) return self.startClientCleanup;
CFRunLoopSourceRef sourceRef = CFSocketCreateRunLoopSource( kCFAllocatorDefault, self.sockRef, 0 );
CFRunLoopAddSource( CFRunLoopGetCurrent(), sourceRef, kCFRunLoopCommonModes );
self.sockRLSourceRef = sourceRef;
CFRelease( sourceRef );
self.sockStatus = CommSocketClientStatusLinked;
return YES;
}
- (BOOL) stopClient {
self.sockStatus = CommSocketClientStatusDisconnecting;
if ( self.sockRef != nil ) {
if ( self.sockRLSourceRef != nil ) {
CFRunLoopSourceInvalidate( self.sockRLSourceRef );
self.sockRLSourceRef = nil;
}
CFSocketInvalidate(self.sockRef);
self.sockRef = nil;
}
if ( [self.delegate respondsToSelector:@selector(handleSocketClientDisconnect:)] )
[self.delegate handleSocketClientDisconnect:self];
self.sockStatus = CommSocketClientStatusDisconnected;
return YES;
}
#pragma mark - Client Validation:
- (BOOL) isSockConnected {
if ( self.sockStatus == CommSocketClientStatusLinked )
return self.isSockRefValid;
return NO;
}
#pragma mark - Initialization:
+ (id) initAndStartClient:(NSURL *)socketURL {
CommSocketClient *client = [[CommSocketClient alloc] initWithSocketURL:socketURL];
[client startClient];
return client;
}
+ (id) initWithSocket:(CFSocketNativeHandle)handle {
CommSocketClient *client = [[CommSocketClient alloc] initWithSocket:handle];
return client;
}
- (id) initWithSocketURL:(NSURL *)socketURL {
if ( (self = [super init]) ) {
self.sockURL = socketURL;
self.sockStatus = CommSocketClientStatusDisconnected;
} return self;
}
- (id) initWithSocket:(CFSocketNativeHandle)handle {
if ( (self = [super init]) ) {
self.sockStatus = CommSocketClientStatusLinking;
if ( ![self socketClientCreate:handle] ) [self startClientCleanup];
else {
CFRunLoopSourceRef sourceRef = CFSocketCreateRunLoopSource( kCFAllocatorDefault, self.sockRef, 0 );
CFRunLoopAddSource( CFRunLoopGetCurrent(), sourceRef, kCFRunLoopCommonModes );
self.sockRLSourceRef = sourceRef;
CFRelease( sourceRef );
self.sockStatus = CommSocketClientStatusLinked;
}
} return self;
}
- (void) dealloc { [self stopClient]; }
#pragma mark - Client Callback:
static void SocketClientCallback (CFSocketRef sock, CFSocketCallBackType type, CFDataRef address, const void *data, void *info) {
CommSocketClient *client = (__bridge CommSocketClient *)info;
if ( kCFSocketDataCallBack == type ) {
NSData *objData = (__bridge NSData *)data;
if ( [objData length] == 0 )
[client stopClient];
else
[client messageReceived:objData];
}
}
@end
好的,就是这样,它应该可以在不同的进程中工作。
只需使用它来创建一个服务器,并提供放置套接字文件的路径。
同样,用它来创建客户端连接
使用我包含的委托(delegate)方法,其余部分应该很简单。最后,保持 url 路径较小(没有为此添加任何实际检查)并且您可以在单独的 NSOperationQueue 中实例化它们(尽管未经测试)。
希望这可以作为完整的工作示例对其他人有所帮助。阿尔文
关于cocoa - UNIX 域套接字和 Cocoa,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/989346/
正如标题所暗示的那样,我无法弄清楚 Unix 内核如何将逻辑文件偏移量转换为逻辑块号,然后从 i-node 中检索它。 作为引用,我要求对 Maurice J. Bach 在“UNIX 操作系统的设计
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 8年前关闭。 Improve this q
我在互联网上做了一些研究,但仍然很困惑。 UNIX 时间是像 GMT/UTC 那样的通用时间还是像本地时间一样因地而异? 我知道 UNIX 时间是从 1970 年 1 月 1 日格林威治标准时间 00
您如何评估 Unix 系统管理员。 Unix 管理员应该具备哪些编程能力? 最佳答案 我用于快速过滤器的一些: 什么是 fork 炸弹,它是好是坏? 给我一个单行命令,计算日志文件中有多少行从昨天的日
谁能告诉我字典文本文件在 UNIX 系统上的位置?或者我在哪里可以获得一个好的字典文本文件?我目前一直在使用来自 SUN 的文本文件,但它包含不带句点的缩写(否则我可以删除它们)。有人能指出我正确的方
在我的 Ubuntu 12 vps 上,我正在运行一个完整的比特币节点。当我第一次启动它时,它使用了大约 700mb 的内存。如果我 24 小时后回来 (free -m) 将如下所示: total
我想编写一个 unix/linux 程序,它将使用一个配置文件。 我的问题是,我应该把文件的位置放在哪里? 我可以将位置(如 /etc )“硬编码”到程序本身中。 但是,我希望它,如果没有权限的用户可
在UNIX脚本编程中,cat是可以将2个文件组合在一起的命令: cat file1 file2 > file3 通过合并前两个生成第三个。 另外,cat可以与管道一起使用: cat file1 | t
我有一个通过 ssh 连接到外部机器的终端,并且有一个进程在其中运行。 是否可以将执行移到后台,以便我可以关闭 ssh 连接而无需终止它?如果是这样怎么办? 最佳答案 按 control + Z,这将
我正在试验我自己的 BSD 或 Linux 发行版。我想以对最终用户有意义的方式组织系统文件。我希望他们能够访问系统,而不会出现 *nixes 留下的所有文件困惑。 有没有办法在不丢失动态链接的情况下
这条评论让我感到困惑:“kill -l 通常会列出所有信号”。我认为信号意味着量化的能量。 [已添加] 请澄清 Unix 中的(计算)信号和物理信号。它们是完全不同的概念吗? [已添加] 范式之间是否
fuser 命令让我知道哪些进程正在使用文件或目录。 我正在寻找相反的命令:让我知道进程正在使用哪些文件。 更新 忘了说它是针对 Solaris 系统的。 最佳答案 lsof -p 来自 here
如果我有一个叫做“orange”的词,我如何将它拆分成单独的字符。 我的输出应该是: o r a n g e 最佳答案 echo orange | fold -w 1 输出 o r a n g e 关
和有什么区别工作和一个 流程在 Unix 中?你能举个例子吗? 最佳答案 作业是由 shell 启动的进程。 shell 在作业表中跟踪这些。作业命令显示事件后台进程的列表。他们得到一个 jobspe
unix 如何处理带空格和参数的完整路径名? 在 Windows 中,我们引用路径并在其后添加命令行参数,在 unix 中如何? "c:\foo folder with space\foo.exe"
我必须合并具有相同标题的多个CSV文件。 我必须保留第一个文件的 header ,并删除所有其他文件的 header ,然后合并它们并创建一个主文件。 文件1: Id,city,name ,locat
我需要在两个字段上加入两个文件。但是,即使连接失败,我也应该检索文件 1 中的所有值,就像左外连接一样。 文件 1: 01|a|jack|d 02|b|ron|c 03|d|tom|e 文件2: 01
在 Solaris, HP-UX 上获取进程大小的正确方法是什么?和 AIX ?我们应该使用 top或 ps -o vsz或者是其他东西? 最佳答案 vsize的确切定义, rss , rprvt ,
我在文件上使用了“touch”,更新了文件的时间戳,但父目录的时间戳没有改变。但是,(如预期)当我在父目录中创建新文件时,该目录的时间戳确实发生了变化。 类 UNIX 操作系统(特别是 AIX)使用什
一般来说,当我们从多个进程向 UNIX 中的文件追加内容时,我们可以认为什么是理所当然的?是否有可能丢失数据(一个进程覆盖另一个进程的更改)?数据有可能被破坏吗? (例如,每个进程都将每个追加一行追加
我是一名优秀的程序员,十分优秀!