我有一个bash脚本可将数据上传到站点。我的上传速度越来越慢,因此我开始使用xargs和-N1并行运行它,同时运行5个。
但是,问题是服务器是否要求我解决一次验证码,如果我一次运行5次,而一次运行1次则可以正常工作。
我认为这是因为所有进程都完全在同一时间启动,因此我被标记了。
无论如何,这就是问题所在,我有什么办法可以在xargs / gnu并行启动过程之间添加等待时间(例如1秒)吗?
我唯一想出的就是使用pgrep脚本| wc -1来计算脚本实例,并休眠该秒数。
但是,这实际上不是最佳选择,是否有更好的方法呢?
sizeof(int)
Dev Cpp
虽然它在64位机器上运行,但在我身上显示4 .为什么不考虑底层硬件并显示8呢?另外,如果我编译环境也改为64位(首先是否64 bit compiler
有意义?!),那么int的大小会改变吗?
是否有任何标准来决定这一点?
在C中,每个字节都是可单独寻址的.假设一个整数(比如使用4个字节)有一个地址0xaddr
(32位,假设我们有32位处理器,32位地址总线和32位数据总线),并假设整数的值为0x12345678
.现在,如果我从内存中获取此值,处理器如何执行此操作?处理器是否在0xaddr
地址线上放置(32位地址),然后获取8位数据0x12
.然后处理器将0xaddr+1
在地址线上加速,然后获取另一个8位数据0x34
,依此类推整数的4个字节?或者处理器是否只是一次放置0xaddr
并读取4个字节,从而利用其完整的32位数据总线?
我能理解一个signed char
和一个之间的区别unsigned
.但是,相应类型的指针在其操作中是否相同?Cos sizeof(char)
和sizeof(unsigned char)
总是一样的(或者有任何反例?)
对于指针,只有数据类型的大小才重要.如果我使用char *
并unsigned char *
互换,是否有任何陷阱?
我觉得这些帖子很有用:(
#include <stdio.h>
#include <stdlib.h>
#include <search.h>
#include <assert.h>
char *data[] = { "alpha", "bravo", "charlie", "delta",
"echo", "foxtrot", "golf", "hotel", "india", "juliet",
"kilo", "lima", "mike", "november", "oscar", "papa",
"quebec", "romeo", "sierra", "tango", "uniform",
"victor", "whisky", "x-ray", "yankee", "zulu"
};
int
main(void)
{
ENTRY e, **ep;
struct hsearch_data *htab;
int i;
int resultOfHcreate_r;
resultOfHcreate_r=hcreate_r(30,htab);
assert(resultOfHcreate_r!=0);
hdestroy_r(htab);
exit(EXIT_SUCCESS);
}
Run Code Online (Sandbox Code Playgroud)
错误 hcreate_r
怎么用hcreate_r
?
还有一个问题是:
您能否使用GNU扩展C库示例?我认为GNU扩展C库的文档写的知识不够.
我有很多关于如何使用扩展C库的问题.
很久以前我的程序中有一个错误.根本原因是C函数
sleep(60);
Run Code Online (Sandbox Code Playgroud)
在极少数情况下会睡不到60秒.或者该函数确实导致线程睡眠时间超过60秒,但是操作系统自动更改了时钟(这似乎很可能只是因为错误发生在上面XX::00::00
),也就是它很少表现出来,而且只在"圆形小时"(睡眠shoudl已经结束> xh0m0s,结束了x-1h59m59.99*s
).
然后我的项目经理咆哮他怎么说了几百万次我们应该只使用计时器,而不是睡觉.从那时起,我接受了定时器比睡眠更准确的概念(),但现在我觉得我应该要求一些更权威的来源.所以:
BTW OS是Linux,但如果可能的话我会关心一般的答案.
我收到意外的文件错误结束.我不确定如何解决它.
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# User specific aliases and functions
export PS1='\[\e[0;32m\]\u\[\e[m\] \[\e[1;34m\]\w\[\e[m\] \[\e[1;32m\]\$\[\e[m\] \[\e[1;37m\]'
export LS_COLORS='di=35;1'
alias la='ls -lah'
alias cdu='cd /home/hzhang/primary'
#module load gnu-compilers/4.7.0
#module load mvapich3/gnu/1.7
.ls /opt/intel/Compiler/11.1/072/bin/ifortvars.sh intel64
#PATH=$PATH:/home/hzhang/primary/over2.2e/bin_dp:/home/hzhang/primary/foiltest
PATH=$PATH:/opt/overflow/intel/serial/bin_dp/:/home/hzhang/primary/chimera2.1/bin_dp/:/u/primary/hzhang/pegasus/bin_dp
export PATH
ulimit -s unlimited
Run Code Online (Sandbox Code Playgroud) 我面临的问题与Linux内核社区所描述的问题非常相似- 由位域背叛
问题的实质在于,GCC发出64位读取访问以访问偶数1位位域。这会导致读取相邻字段的意外副作用,而该副作用可在程序的其他位置进行修改。当回写修改后的位域值时,相邻变量的旧值也会被回写,从而丢失其他线程对其所做的任何修改。
我的问题略有不同。我有这样的课程/结构-
class Group {
uint8 adjVariable;
volatile bool flag1: 1;
volatile bool flag2: 1;
// so on...
volatile bool flag10: 1;
};
Run Code Online (Sandbox Code Playgroud)
访问这些变量的方式是-
Group::fun() {
Group_Scoped_lock();
// adjVariable was 12 here.
if ( adjVariable > 0 ) {
adjVariable = 0; // <------- EXPLICIT ZERO ASSIGNMENT
}
// some code that doesn't affect adjVariable
bool1 = false;
bool2 = false;
bool3 = false;
assert( adjVariable == 0 ); // <---- This assert is tripping stating that adjVariable …
Run Code Online (Sandbox Code Playgroud) 我不确定标题是否反映了我在这里问的内容,但如果没有很长的标题,我能做到的最好。我正在尝试worker thread
在pthreads
. 我想从main
函数中生成一组线程,然后main
线程将作业委托给工作线程并等待所有线程完成,然后再为它们分配下一个作业(实际上,要求是将线程安排在一个块中,很像 CUDA编程模型,但在 CPU 上。虽然它与当前问题无关)。该job
数组用于向每个线程指示作业类型。目前,我已经使用信号量实现了这一点,这会强制执行繁忙的等待。我正在寻找方法使线程仅在需要时才进入睡眠和唤醒状态,而不是连续轮询。
每个线程执行的函数
volatile int jobs[MAX_THREADS]; // global job indicator array
sem_t semaphore; // semaphore to indicate completion
thread_execute(void *args)
{
tid = get_id(args);
while(jobs[tid] != -1)
{
if(jobs[tid] == 0) continue; // no job
if(jobs[tid] == JOBS_1)
{
jobs1();
jobs[tid] = 0; // go back to idle state
sem_post(&semapahore);
}
if(jobs[tid] == JOBS_2)
{
jobs2();
jobs[tid] = 0; // go back to idle state
sem_post(&semapahore); …
Run Code Online (Sandbox Code Playgroud) 我能够执行系统调用调用并在内核中进行处理.但很少有事情我不清楚.进入swi例程后,内核将用户模式寄存器保存在堆栈中.问题是-
是谁的堆栈?(因为swi处理和相应的系统调用例程需要堆栈框架才能工作)
如果它是Kernel自己的堆栈,从哪里获得堆栈分配..?它会开始使用当前的堆栈吗?如果是,则current可以是内核中当时可能正在执行的任何进程.这不是耗尽电流的堆栈吗?
如果它在swi处理程序中使用当前正在执行的User进程的堆栈,那么这将是内核现在将访问的用户地址空间.这可能吗?由于内核可寻址内存在1GB以内(如果在4GB RAM内存系统中使用1:3内核到用户地址空间比率).