小编tom*_*990的帖子

在 PHP exec 中重定向 STDERR

我正在编写一个需要调用外部命令行实用程序的 PHP 脚本,我正在使用 exec() 进行调用。在本地一切正常,但是当我将其移至实时服务器时,它不再起作用。

经过一些调试,我相信问题归结为 STDERR 重定向 - 如果我尝试与重定向有关的任何事情(重定向到 STDIN,重定向到文件),则命令完全失败。

我写了一个简单的bat脚本来简化测试:

@echo off
echo STDOUT test
echo STDERR test 1>&2
Run Code Online (Sandbox Code Playgroud)

然后在 PHP 中:

<?php
$cmd = "_test.bat 2>&1";
exec($cmd, $output, $status);
var_dump($output);
var_dump($status);
?>
Run Code Online (Sandbox Code Playgroud)

在本地服务器上,结果是 $status=0, $output=array("STDOUT test", "STDERR test") 如我所料,但在实时服务器上,结果是 $status=1,输出为空大批!

如果我删除 1>&2 部分,我会得到相同的结果(只是 STDOUT 部分),所以命令本身显然按预期工作。

我在这里缺少一些简单的东西吗?如果有帮助,则该服务器正在运行 Windows Server 2008 R2。

php windows wamp exec windows-server-2008

5
推荐指数
1
解决办法
4442
查看次数

将两个不同的结构传递到相同的函数中

我有2个不同大小的结构,我想有一个功能,我可以将它们传入.但是,我不知道如何定义函数的参数来接受2个不同的结构.

我的结构如下

struct {
    int a;             // 2 byte
    int b;             // 2 byte
    int c;             // 2 byte
    int d;             // 2 byte
}  person1;                // 8 bytes


struct {
    int a;            // 2 byte
    DeviceAddress b;  // 8 bytes
    int c             // 2 bytes
    float d;      // 4 bytes
}  person2;               // 16 bytes

function print_struct(struct& ?????)
{
     actions here....
}


print_struct(person1);
print_struct(person2);
Run Code Online (Sandbox Code Playgroud)

c struct arguments function

4
推荐指数
2
解决办法
3710
查看次数

在Cocoa类中使用Core Audio

我一直在研究学习核心音频书中的例子.本书很好地解释了API及其工作原理,但并没有真正讨论如何将它们集成到Cocoa项目中.

我真的不确定如何将核心音频/ midi编程与obj-c类混合.是否有任何好的教程可以解释这样做的标准做法?

目前我脑海中的一些问题是:

  • 如果我需要一个userdata结构,我可以用某种obj-c实例变量或@properties替换它,或者这必须是一个C结构吗?
  • 我应该在哪里将音频回调函数放在我的代码中?他们可以坐在@implementation之外的某个地方吗?
  • 由于回调函数是用C语言编写的,如果我想调用objective-C函数或访问其中的类属性,我该怎么办?

macos cocoa objective-c core-audio coremidi

2
推荐指数
1
解决办法
721
查看次数

C:使用fgets()清除stdin输入缓冲区不能正常工作

我使用以下方法清除输入缓冲区:

void dump_line(FILE *fp) {
    int ch;    
    while ( (ch = fgetc(fp)) != EOF && ch != '\n');
}
Run Code Online (Sandbox Code Playgroud)

如果我使用scanf()从stdin读取,这可以正常工作:

char string[51];
...
scanf("%50[^\n]", string);
dump_line(stdin);
Run Code Online (Sandbox Code Playgroud)

但是,如果我改为使用fgets(),如下面的代码所示:

char string[52];
...
fgets(string, 52, stdin);
dump_line(stdin);

// Since fgets() reads in the '\n', trim the end of the string:
string[strlen(string)-1] = 0;
Run Code Online (Sandbox Code Playgroud)

由于fgets()读入'\n'字符,我发现需要分配一个较大的char缓冲区并将字符串修剪回一个字符.这工作正常,但dump_line函数存在问题.当使用scanf()版本时,它按预期工作,因为由于使用[^ \n],输入缓冲区中将始终存在'\n'.因此,即使这是缓冲区中剩下的唯一字符,在dump_line()中,fgetc()读取char,因为它是'\n',所以while循环被破坏了.

在fgets()版本中,如果它适合字符串缓冲区,则读入'\n',将stdin留空.这导致程序在fgetc()上等待,要求用户按Enter键进一步前进,这显然不是我所追求的.另一方面,如果用户为缓冲区输入的字符串太长,dump_line()工作正常!

我猜这个问题与EOF有关,但我似乎无法让它按预期工作!任何帮助将不胜感激.

如果有任何帮助,我正在使用的平台是Mac OSX,以防万一这是某种特定于平台的怪癖.

c macos stdin fgets eof

1
推荐指数
1
解决办法
2893
查看次数

什么被认为是重载主线程?

我在用户界面上显示来自数据模型的信息.我目前的做法是通过授权如下:

@protocol DataModelDelegate <NSObject>
- (void)updateUIFromDataModel;
@end
Run Code Online (Sandbox Code Playgroud)

我在我的控制器类中实现了委托方法,如下所示,使用GCD将UI更新推送到主线程:

- (void)updateUIFromDataModel {

    dispatch_async(dispatch_get_main_queue(), ^{

        // Code to update various UI controllers
        // ...
        // ...

    });
}
Run Code Online (Sandbox Code Playgroud)

我关心的是,在某些情况下,这种方法可以非常频繁地调用(每秒约1000次,每次更新多个UI对象),这对我来说非常像我用命令"垃圾邮件"主线程.

发送到主线程是否太多了?如果有的话,是否有人对什么是接近这个的最佳方式有任何想法?

我已经研究过了dispatch_apply,但是当合并数据时这似乎更有用,这不是我所追求的 - 我真的只想跳过更新,如果它们太频繁,那么只有大量的更新被发送到主线程!

我正在考虑采用不同的方法并实现定时器而不是每10毫秒轮询数据,但是由于数据更新往往是零星的,我觉得这样做会很浪费.

结合这两种方法,我考虑的另一个选择是等待更新消息并通过设置定时器以设定的间隔轮询数据来响应,然后如果数据似乎已经停止改变则禁用定时器.但是这会使问题过于复杂吗?理智的方法是简单地让一个恒定的计时器运行吗?

编辑: 在下面添加了一个答案,显示使用调度源的调整

macos user-interface cocoa timer grand-central-dispatch

1
推荐指数
2
解决办法
491
查看次数