小编Jay*_*hoi的帖子

为什么0 <-0x80000000?

我有一个简单的程序:

#include <stdio.h>

#define INT32_MIN        (-0x80000000)

int main(void) 
{
    long long bal = 0;

    if(bal < INT32_MIN )
    {
        printf("Failed!!!");
    }
    else
    {
        printf("Success!!!");
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

条件if(bal < INT32_MIN )总是如此.这怎么可能?

如果我将宏更改为:

#define INT32_MIN        (-2147483648L)
Run Code Online (Sandbox Code Playgroud)

有谁可以指出这个问题?

c signed numeric-conversion numeric-limits

251
推荐指数
6
解决办法
2万
查看次数

如何在osx上使用clang编译共享库

源文件

rsetti::fastidio { /tmp }-> cat foo.c

    #include <stdio.h>
    void ACFunction() {
      printf("ACFunction()\n");
      AGoFunction();
    }
Run Code Online (Sandbox Code Playgroud)

编译共享库

rsetti::fastidio { /tmp }-> clang -shared -o libfoo.so foo.c

    foo.c:4:3: warning: implicit declaration of function 'AGoFunction' is invalid in C99 [-Wimplicit-function-declaration]
      AGoFunction();
      ^
    1 warning generated.
    Undefined symbols for architecture x86_64:
      "_AGoFunction", referenced from:
          _ACFunction in foo-lFDQ4g.o
    ld: symbol(s) not found for architecture x86_64
    clang: error: linker command failed with exit code 1 (use -v to see invocation)

rsetti::fastidio { /tmp }->
Run Code Online (Sandbox Code Playgroud)

linux + …

c macos gcc shared-libraries clang

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

为什么我没有在bash中使用kill -9命令获取SIGKILL信号?

在bash脚本中我处理不同的信号如下:

#!/bin/bash

sighdl () 
{
  echo "signal caught"
  #do something
  exit 0
}

trap sighdl SIGKILL SIGINT SIGTERM
Run Code Online (Sandbox Code Playgroud)

以上代码处理信号适合以下活动:

  1. Ctrl+C
  2. kill pid
  3. pkill scriptname

因为kill -9 pid它没有打电话sighdl.根据我的理解(如果我没有错)kill -9发送SIGKILL信号.

任何的想法?

linux bash signals

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

Sed 命令无法按预期从文件中删除特定行

我尝试使用sed命令从文件中删除特定行,但它似乎在我的系统中无法正常工作(CentOS 版本 6.3(最终版))。

我的 file1.txt 包含以下数据

line1
line2
line3
line4
line5
Run Code Online (Sandbox Code Playgroud)

现在我尝试下面的命令从文件中删除第三行。

$ sed '3d' file1.txt 
Run Code Online (Sandbox Code Playgroud)

上述命令的输出是

line1
line2
line4
line5
Run Code Online (Sandbox Code Playgroud)

但当我检查原始文件时,似乎没有删除任何内容。第三行在那里。

那么有人知道为什么sed不工作吗?

linux bash centos sed

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

这些宏有什么作用?

我继承了一些经过严格混淆和写得不好的PIC代码来修改.这里有两个宏:

#define TopByteInt(v) (*(((unsigned char *)(&v)+1)))
#define BottomByteInt(v) (*((unsigned char *)(&v)))
Run Code Online (Sandbox Code Playgroud)

有人能够解释他们到底做了什么以及这意味着什么?

谢谢 :)

c pic

5
推荐指数
2
解决办法
104
查看次数

枚举数据类型在 bash 中似乎不可用

有了 bash,创建了通过索引访问数组元素的简单脚本。如下所示

#! /bin/bash

OK_INDEX=0
CANCEL_INDEX=1
ERROR_INDEX=2
CONFIRM_INDEX=3
SAVE_INDEX=4
EXIT_INDEX=5
declare -a messageList=("ok" 
                        "cancel" 
                        "error" 
                        "confirm"
                        "save"
                        "exit")

printf "%s \n" ${messageList[$CANCEL_INDEX]}
Run Code Online (Sandbox Code Playgroud)

从上面的脚本中,我需要声明适当的索引变量来从数组列表中检索有效消息,但对我来说声明每个变量并为它们提供索引可能不太方便。如果变量像 C 中的ENUM数据类型一样自动获取值,那就太好了

在C中,可以通过类似的方式

enum index { OK_INDEX, CANCEL_INDEX, ERROR_INDEX,CONFIRM_INDEX,SAVE_INDEX,EXIT_INDEX};
Run Code Online (Sandbox Code Playgroud)

ENUMbash有没有其他选择?

我发现了很多,但没有成功,然后尝试了一些技巧来实现这一点,如下所示

ENUM=(OK_INDEX CANCEL_INDEX ERROR_INDEX CONFIRM_INDEX SAVE_INDEX EXIT_INDEX)

maxArg=${#ENUM[@]}

for ((i=0; i < $maxArg; i++)); do
    name=${ENUM[i]}
    declare -r ${name}=$i
done
Run Code Online (Sandbox Code Playgroud)

因此,从上面的代码片段中我成功创建了常量,但看起来很长意味着只需声明变量我需要编写 5-10 行代码,这是不公平的。

那么有人有另一种解决方案吗?

linux bash enums

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

无法在centOS中运行sshpass命令

在CentOS 6.3版(最终版)系统上工作.并尝试使用sshpass实用程序ssh另一台机器

sshpass -p 'password' ssh user@host
Run Code Online (Sandbox Code Playgroud)

但它给我的错误就像

sshpass: Failed to run command: No such file or directory
Run Code Online (Sandbox Code Playgroud)

所以从错误我认为sshpass可能不是安装所以尝试安装它yum install sshpass并得到以下日志

Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
 * base: mirror.leapswitch.com
 * epel: epel.mirror.net.in
 * extras: mirror.leapswitch.com
 * nux-libreoffice.org-rpms: mirror.li.nux.ro
 * updates: mirror.leapswitch.com
Setting up Install Process
Package sshpass-1.05-1.el6.i686 already installed and latest version
Nothing to do
Run Code Online (Sandbox Code Playgroud)

从上面看似sshpass已经安装了.所以它为什么不工作?

ssh centos sshpass

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

在验证工作正常时,网络掩码验证似乎无法在bash脚本中使用正则表达式

我编写了简单的脚本来验证IP地址和Netmask,如下所示

#!/bin/bash

validFormatIP()
{
    echo $1 | grep -w -E -o '^(25[0-4]|2[0-4][0-9]|1[0-9][0-9]|[1]?[1-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' > /dev/null
    if [ $? -eq 0 ]
    then
        echo "Valid ipaddress"
    else
        echo "Inalid ipaddress"
    fi
}

validNetMask()
{
    echo $1 | grep -w -E -o '^(254|252|248|240|224|192|128)\\.0\\.0\\.0|255\\.(254|252|248|240|224|192|128|0)\\.0\\.0|255\\.255\\.(254|252|248|240|224|192|128|0)\\.0|255\\.255\\.255\\.(254|252|248|240|224|192|128|0)' > /dev/null
    if [ $? -eq 0 ]
    then
        echo "Valid netmask"
    else
        echo "Invalid netmask"
    fi  
}

setIpAddress()
{
    ip_address=`echo $1 | awk -F= '{print $2}'` 
    validFormatIP $ip_address
}
setNetMask()
{
    ip_address=`echo $1 | awk -F= '{print $2}'` 
    validNetMask …
Run Code Online (Sandbox Code Playgroud)

regex linux validation bash

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

如何从脚本本身检查脚本是否正在运行?

有下面的示例脚本 sample.sh

#!/bin/bash

if ps aux | grep -o "sample.sh" >/dev/null
then
    echo "Already script running"
    exit 0
fi

echo "start script"

while true
do
    echo "script running"
    sleep 5
done
Run Code Online (Sandbox Code Playgroud)

在上面的脚本中,我想检查以前运行的脚本是否运行然后再运行它.

问题是检查条件总是变为真(因为检查条件需要运行脚本)并且它总是显示"Already script running"消息.

知道怎么解决吗?

linux bash

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

用python中的特定字符串替换完全匹配的单词

我是Python的新手,这是我第一个替换word的脚本.

我的文件test.c包含以下两行

printf("\nReboot not supported.  Exiting instead.\n");
fprintf(stderr, "FATAL:  operation not supported!\n");
Run Code Online (Sandbox Code Playgroud)

现在我要替换printffprintf通过//printf//fprintf分别.

这是我尝试过的

infile = open('path\to\input\test.c')
outfile = open('path\to\output\test.c', 'w')

replacements = {'printf':'//printf', 'fprintf':'//fprintf'}

for line in infile:
    for src, target in replacements.iteritems():
        line = line.replace(src, target)
    outfile.write(line)
infile.close()
outfile.close()
Run Code Online (Sandbox Code Playgroud)

但是我得到了这个

fprintf//f//printf这是错误的.

对于解决方案已经看了这个答案,但不能适应我的脚本.

任何人都知道如何解决它?

python

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