我知道这是一个简单的问题,但我仍然很困难,无法弄明白.有人能帮我吗?
char buf1[] = "one second program started\n";
char buf2[] = "one second program end\n";
int main(void)
{
write(1,buf1,100);
sleep(1);
write(1,buf2,100);
}
Run Code Online (Sandbox Code Playgroud)
我需要打印第一个语句,然后在单元等待之后,打印第二个语句.但是,当我执行它时,两个语句都打印出来,然后单元等待,第二个语句打印两次.我哪里错了?
首先抱歉,如果这是一个愚蠢的问题(肯定是这样),但我真的很擅长在Unix中使用Syscall.我试图用"写"在文件上写东西; 它正确地创建了文件,但没有写任何内容,这就是代码:
int main(void) {
int fd;
char *string = "Test";
if(fd=open("home/user/test.txt", O_WRONLY | O_APPEND | O_CREAT)==-1){
perror("Open failed");
}
printf("%d\n", strlen(string));
printf("Wrote %d byte on the file", write(fd,string,strlen(string)));
close(fd);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
哪里是我的问题?谢谢
可能重复:
管道子进程标准输出到变量
我正在运行python程序:
import os
os.system("ls") # ls command runs on the terminal
Run Code Online (Sandbox Code Playgroud)
要将输出存储在文件中:
os.system("ls > a.txt")
Run Code Online (Sandbox Code Playgroud)
我需要的是,它将输出存储在一些临时字符串中.那可能吗 ??
我实施了一个新的系统调用作为介绍练习.它只需要一个缓冲区和printk缓冲区.我后来才知道正确的做法是使用copy_from_user.
这只是一个验证地址的预防措施,还是我的系统调用导致一些我看不到的错误(页面错误?)?
如果只是一种预防措施,它有什么保护作用?
谢谢!
这是一个代码,我一个接一个地使用2个fork()系统调用 - 它是如何实际工作的?
#include <unistd.h>
#include <iostream.h>
using namespace std;
int main()
{
cout << "0. I am process " << getpid() << endl;
(void) fork();
cout << "1. I am process " << getpid() << endl;
(void) fork();
cout << "2. I am process " << getpid() << endl;
}
Run Code Online (Sandbox Code Playgroud)
我得到输出为:
0.我是过程27701
1. 我是过程25915 1.我是
过程27701
2.我是过程27781
2.我是过程26170
2.我是过程27701
这是我使用3个fork系统调用的下一个程序,如何获得这样的输出?如果我手动解决这个代码,逻辑是什么?
#include <unistd.h>
#include <iostream>
using namespace std;
int main()
{
cout << "0. I am process " << getpid() …Run Code Online (Sandbox Code Playgroud) 我想在awk中使用stat命令来实现列出文件的修改时间(以秒为单位).我想将stat中的输出信息保存在变量中,并在awk中进一步处理.如何格式化命令来实现这个目标?
ls -la | awk '{ system("a=$(stat -c %Y $9)"); (further operation on a...) }'
Run Code Online (Sandbox Code Playgroud)
提前致谢
多米尼克
我有这个代码片段,我甚至读了几次信号系统调用,我仍然不明白为什么程序停止第四次我按CTRL-C,而不是第三次.提前致谢!
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
int i=0;
void handler(int sig)
{
i++;
printf("CTRL-C\n");
if (i==3)
signal(SIGINT, SIG_DFL);
}
int main()
{
signal(SIGINT,handler);
while (1)
{
printf("Hello world!\n");
sleep(1);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我读到信号系统调用不可移植,所以如果我提到我使用的是最新版本的Ubuntu(14.04),它可能会有所帮助.
我正在编写一些ROP漏洞利用代码,通过系统调用调用mprotect,调用int 0x80后eax设置为0x0表示成功.将执行转移到目标地址仍会产生SIGSEGV.我希望有人能告诉我哪里出错了.
一些细节,目标地址是.data部分,这是我将通过shellcode编写的地方:
[20] 0x8146820->0x814c2b8 at 0x000fd820: .data ALLOC LOAD DATA HAS_CONTENTS
我设置eax到125,ebx页面边界0x8146000,ecx以0x1000(4096页大小),并edx以0x7(RWX).
就在系统调用之前,寄存器看起来像这样:
eax 0x7d 125
ecx 0x1000 4096
edx 0x7 7
ebx 0x8146000 135553024
esp 0xbffff2b0 0xbffff2b0
ebp 0x8d0e0f0 0x8d0e0f0
esi 0x804fb85 134544261
edi 0x43434343 1128481603
eip 0x80c0182 0x80c0182 <mprotect+18>
eflags 0x202 [ IF ]
cs 0x73 115
ss 0x7b 123
ds 0x7b 123
es 0x7b 123
fs 0x0 0
gs 0x33 …Run Code Online (Sandbox Code Playgroud) 我想在Linux中用C++更改文件的权限.用户必须使用以下语法输入权限:"请在终端中输入权限:rwx-wr--".
谢谢你的帮助.
我期待编写一个程序,需要对进程进行低级别的工作(即使用fork系统调用等).该程序用C++编写,只能在Linux上运行.理想情况下,这将是整个CPU架构(即86,x86_64和ARM)与只不过是重新编译更便携,但我只真正需要x86_64的支持.
由于每个Linux系统调用都需要许多参数并在cpu寄存器中返回许多参数(通常只有1个返回值),因此每个系统调用的C函数包装器很容易实现.另外,因为AFAIK,在内核中实现的系统调用具有相同的参数和返回值,如果是不同的汇编级实现,则可以公开相同的C接口.
这样的事情存在吗?如果是这样,我该如何访问它?
它的文档在哪里(可用函数列表,它们的解释参数以及函数的确切解释)?