我想创建一个填充0或其他字母的文件。这是我的功能
int fill(const int d, struct aiocb *aiorp, void *buf, const int count){
int rv = 0;
memset( (void *)aiorp, 0, sizeof( struct aiocb ) ); // <-here second paramether is 0
aiorp->aio_fildes = d;
aiorp->aio_buf = buf;
aiorp->aio_nbytes = count;
aiorp->aio_offset = 0;
rv = aio_write( aiorp );
return rv;
}
这是我的主要
int main(int argc, char * argv[]){
int des;
int rv;
struct aiocb aior;
char buffer[1000];
if(argc == 3){
printf("just %s\n", argv[1]);
des = createFile(argv[1]);
rv = fill(des, &aior, buffer, sizeof(buffer));
}
return 0;
}
所以我的输出应该是文件填充零值,但我的文件充满了垃圾
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@$
y▒^X^@^@^@^@^@^@^@
s|▒^@^@^@^@^@^@^@^@^@^@^@^@▒r|▒^@^@^@^@▒▒^?▒(▒▒▒▒▒{▒▒
y▒^P^@^@^@▒
y▒^A^@^@^@d^Cy▒^@^@^@^@▒
y▒^T
y▒^P▒▒▒^@^@^@^@^@^@^@^
...
为什么呢?怎么了?
以下是代码:
sukurti - 如果该文件不存在则创建新文件 填充 - 填充创建的文件
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <aio.h>
#define MB 1024
int sukurti(char *name);
int fill(const int d, struct aiocb *aiorp, void *buf, const int count);
int sukurti(char *name){
int dskr;
dskr = open( name, O_RDONLY );
if( dskr == -1 ){
printf("Failas sukurtas, nes jo nebuvo\n");
dskr = open( name, O_WRONLY | O_CREAT, 0644);
}else{
printf("Jau yra toks failas!\n");
exit(1);
}
return dskr;
}
int fill(const int d, struct aiocb *aiorp, void *buf, const int count){
int rv = 0;
memset( (void *)aiorp, 'A', sizeof( struct aiocb ) );
aiorp->aio_fildes = d;
aiorp->aio_buf = buf;
aiorp->aio_nbytes = count;
aiorp->aio_offset = 0;
rv = aio_write( aiorp );
return rv;
}
int main(int argc, char * argv[]){
int des;
int rv;
struct aiocb aior;
int x = atoi(argv[2]);
printf("%d\n", x);
int size = MB * MB * x;
char buffer[size];
if(argc == 3){
printf("just %s\n", argv[1]);
des = sukurti(argv[1]);
rv = fill(des, &aior, buffer, sizeof(buffer));
}else{
printf("Blogas\n");
}
return 0;
}
编辑: 我知道我的文件结束了
答案 0 :(得分:5)
这里有三个问题:
buffer
未被初始化。使用
memset(buffer,
<what ever 8bit value you want the file to be filled with>,
sizeof buffer);
在main()
中定义后。
aior
错误地初始化。使用
0
memset(aiorb, 0, sizeof aior);
在main()
中定义后立即删除memset()
中对fill()
的调用。
最后,程序很可能在之前结束缓冲区异步写入磁盘。
要解决此问题,请定义man 7 aio
下提到的通知方法。并让程序等待在>结束程序之前收到此通知。
例如,可以通过信号询问完成通知并等待此信号来完成。
为此,请按以下步骤修改代码:
将以下两行添加到aiorp
中fill()
所指向的初始化中:
aiorp->aio_sigevent.sigev_notify = SIGEV_SIGNAL;
aiorp->aio_sigevent.sigev_signo = SIGUSR1;
为了能够处理发送的通知信号(不结束程序),需要设置信号处理程序:
void handler(int sig)
{
/* Do nothing. */
}
通过调用
安装此处理程序signal(handler, SIGUSR1);
就在课程开始时。
return
来自main()
来电wait_for_completion(SIGUSR1)
之前void wait_for_completion(int sig)
{
sigset_t set;
sigemptyset(&set);
sigaddset(&set, sig);
sigwait(&set, &sig); /* This blocks until sig had
been received by the program. */
printf("Completion notification for asynchronous 'write'-operation received.\n");
}
可能如下:
DECLARE @empID NVARCHAR(50)
DECLARE @projectID NVARCHAR(50)
SELECT @empid = Emp_id from EMPLOYEE WHERE Emp_id = '123461'
SELECT @ProjectID = PROJECT_ID from PROJECTS where PROJECT_ID = 'P300'
IF (@empid is not null and @ProjectID is not null)
BEGIN
INSERT INTO PALLOCATION (Emp_id, Project_id, Staff_cost)
VALUES (@empid,@ProjectID,'800')
END
根据需要添加错误处理。为了便于阅读,我把它留了出来。
答案 1 :(得分:4)
memset( (void *)aiorp, '0', sizeof( struct aiocb ) );
0
不是'0'
,您需要实际使用ASCII值(如果我没记错的话,则为48)。