我正在尝试使用select函数在服务器和1个客户端(不再)之间进行非阻塞i/o,其中通信流畅(可以随时发送而另一个将在不等待发送的情况下接收).我找到了一些包含一些代码的教程,并尝试将其改编为我的.这就是我所拥有的 -
服务器
#define PORT "4950"
#define STDIN 0
struct sockaddr name;
void set_nonblock(int socket) {
int flags;
flags = fcntl(socket,F_GETFL,0);
assert(flags != -1);
fcntl(socket, F_SETFL, flags | O_NONBLOCK);
}
// get sockaddr, IPv4 or IPv6:
void *get_in_addr(struct sockaddr *sa) {
if (sa->sa_family == AF_INET)
return &(((struct sockaddr_in*)sa)->sin_addr);
return &(((struct sockaddr_in6*)sa)->sin6_addr);
}
int main(int agrc, char** argv) {
int status, sock, adrlen, new_sd;
struct addrinfo hints;
struct addrinfo *servinfo; //will point to the results
//store the connecting address and size …Run Code Online (Sandbox Code Playgroud) 我在我的脚本中使用两次stat来查找文件文件权限,一次查找文件的大小.
`stat -c %A "$directory/$file"`
`stat -c %s "$directory/$file"`
Run Code Online (Sandbox Code Playgroud)
我使用的是OSX 10.7,目录和文件是我所在的当前目录和文件的变量.
我最近开始使用dTrace,并注意到它有多棒.它是完美的分析工具,不会给程序员带来负担,在他们的应用程序中设置数百个探针.
我在这里和那里找到了一些不错的衬里和示例脚本,但我想知道其他人可能想要分享的脚本,工具和链接.
BTW有人试过Chimes吗?
在查看各种许可证的细节时我感到很困惑,并且想知道是否有人可以帮助我.基本上,我正在寻找一个简单的SSH客户端在应用商店上发布.应用程序商店中的所有其他SSH客户端都会收费,虽然我确信它们会比我做的更好,但我想添加一个免费选项.目前我只是将其开发用于个人用途或在我工作的公司内部,我意识到这意味着我不需要担心GPL不兼容性,但我认为我最好将其设置为工作如何我首先想要的是,而不是在后期围绕不同的核心进行重建.
我的想法是使用预先构建的SSH库,但这个想法似乎充满了法律问题.
GNU版本rm有一个很酷的-I标志.从联机帮助页:
-I prompt once before removing more than three files, or when removing recursively. Less
intrusive than -i, while still giving protection against most mistakes
Run Code Online (Sandbox Code Playgroud)
Mac不会:
$ rm -I scratch
rm: illegal option -- I
usage: rm [-f | -i] [-dPRrvW] file ...
unlink file
Run Code Online (Sandbox Code Playgroud)
有时人们coreutils在Mac上安装了(GNU版本),有时却没有.有没有办法在继续之前检测此命令行标志?我想在我的bash_profile中有这样的东西:
if [ has_gnu_rm_version ]; then
alias rm="rm -I"
fi
Run Code Online (Sandbox Code Playgroud) 一直在做一些谷歌搜索和一些关于这个主题的阅读,但无论我花了多少时间搜索,似乎无法做到正确.
我想要做的是通过宣传我对他们提供的服务的兴趣来接收在我的网络上连接的设备的广播消息.使用wireshark,我可以看到来自我想通过网络发送的网络设备的广播/通知消息,但不能通过我的广播搜索来查看他们服务的兴趣.但是通过网络实用程序,我可以看到套接字已创建,但不知道它处于哪种状态,无论是监听还是已连接.
是的,我知道我可以使用这些库来实现这一目标,但我想从头开始构建自己的东西,并更好地了解它是如何工作的.
MySocket.h
#import <Foundation/Foundation.h>
#import <CoreFoundation/CoreFoundation.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#if TARGET_OS_IPHONE
#import <CFNetwork/CFNetwork.h>
#endif
@interface MySocket : NSObject
{
NSString* _message;
CFSocketRef cfSocket;
CFRunLoopSourceRef cfSource;
}
- (void)listen;
@end
Run Code Online (Sandbox Code Playgroud)
MySocket.m
#import "MySocket.h"
#define MAX_UDP_DATAGRAM_SIZE 65507
@implementation MySocket
static void socketCallback(CFSocketRef cfSocket, CFSocketCallBackType
type, CFDataRef address, const void *data, void *userInfo)
{
NSLog(@"socketCAllBAck was called");
}
- (void)listen
{
//Enable broadcast to network hosts
int yes = 1;
int setSockResult = 0;
_message = [[NSMutableString alloc …Run Code Online (Sandbox Code Playgroud) 我很好奇什么样的缓冲区大小write()和read()可以在Linux/OSX/FreeBSD上处理,所以我开始玩下面的哑项目:
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
int main( void ) {
size_t s = 8*1024*1024 - 16*1024;
while( 1 ) {
s += 1024;
int f = open( "test.txt", O_CREAT | O_WRONLY | O_TRUNC, S_IRUSR | S_IWUSR | S_IXUSR );
char mem[s];
size_t written = write( f, &mem[0], s );
close( f );
printf( "(%ld) %lu\n", sizeof(size_t), written );
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这让我可以测试在segfaulting之前我能得到的看似"8MB障碍"的接近程度.在大约8MB标记处,我的程序死了,这是一个示例输出:
(8) 8373248
(8) 8374272
(8) 8375296
(8) 8376320
(8) 8377344
(8) …Run Code Online (Sandbox Code Playgroud) 尽管仔细阅读了相关的标准文档,但在open使用包含标志的系统调用调用系统调用时,我无法理解POSIX兼容系统中的预期行为O_CREAT|O_DIRECTORY.
该标准规定了
如果设置了O_CREAT和O_DIRECTORY 且请求的访问模式既不是O_WRONLY也不是O_RDWR,则结果未指定.
但是它没有指定既没有系统的行为(O_CREAT|O_DIRECTORY|O_WRONLY),也没有(O_CREAT|O_DIRECTORY|O_RDWR).确实(据我所知),行为EISDIR仅适用于现有目录.
在与O_CREATE相关的部分中,标准指定当命名文件不存在时,
如果未设置 O_DIRECTORY ,则应将文件创建为常规文件; [...]
但同样没有说明如果O_DIRECTORY设置也会发生什么.
我看两者的手册页NetBSD的(这臭名昭著非常关心的POSIX兼容)和Linux的(这是一种广泛使用的系统,尽管实际上不是POSIX一个),但我无法找到任何澄清.
说两个标志的使用是否未指定是否正确?如果是这样,最常见的行为是什么?
是否open(name, O_CREAT|O_DIRECTORY, mode) 相当于mkdir任何POSIX兼容的操作系统?
几年来,我经常需要将(已排序)文本的行与匹配的第一个字段组合在一起,而我从未找到过优雅(即单行unix命令行)的方法.我想要的是与unix join命令的相似之处,但是join需要2个文件,每个键最多出现一次.我想从一个文件开始,其中一个键可能出现多个tile.
我有一个执行此操作的ruby和perl脚本,但是没有办法将我的算法缩短为单行.经过多年的UNIX的使用,我还在学习新的技巧有comm,paste,uniq,等,我怀疑有一个聪明的办法来做到这一点.
有一些相关的问题,比如将所有具有相同第一列的行连接到同一行 ; 命令行匹配第一个字段匹配的行(sed,awk等) ; 并将线条与匹配的键组合在一起 - 但这些解决方案从未真正提供干净可靠的解决方案.
这是示例输入:
apple:A fruit
apple:Type of: pie
banana:tropical fruit
cherry:small burgundy fruit
cherry:1 for me to eat
cherry:bright red
Run Code Online (Sandbox Code Playgroud)
这是示例输出:
apple:A fruit;Type of: pie
banana:tropical fruit
cherry:small burgundy fruit;1 for me to eat;bright red
Run Code Online (Sandbox Code Playgroud)
这是我理想的语法:
merge --inputDelimiter=":" --outputDelimiter=";" --matchfield=1 infile.txt
Run Code Online (Sandbox Code Playgroud)
"matchfield"实际上是可选的.它可能永远是第一个领域.分隔符的后续出现应该被视为纯文本.
我不介意perl,ruby,awk单行,如果你能想到一个简短而优雅的算法.这应该能够处理数百万行输入.有任何想法吗?